资讯专栏INFORMATION COLUMN

vertx的一些问题

MRZYD / 1132人阅读

摘要:但经过一段使用后,发现的一些问题。这样产生了一系列问题。部署的是异步的多线程环境,这个方法必须是线程安全的。小结的体系结构无疑是非常先进的,多线程异步结构,内置,支持,支持高可用度,这些都不是轻易能够提供的。

最近想选高效,简洁,扩充性强的web框做为移动平台后台,在对一系列框架对比后,选择了vertx。但经过一段使用后,发现vertx的一些问题。

1.vertx使用共享资源产生的重复代码

在vertx中,verticle是最基本的结构,简单的说类似j2ee servlet,但是verticle更加灵活,不仅可以是服务,也可是客户端,verticle之间通过eventbus通讯,实际上更类似akka的actor,vertx实现了类似nodejs express风格的web框架,但是java是多线程的,通常java的面向的目标环境更复杂。这样产生了一系列问题。
如jdbc连接池,在创建的时候必须在 verticle的start 中引入类似的语句

JDBCClient client = JDBCClient.createShared(vertx, new JsonObject().clear()
                .put("provider_class", "io.vertx.ext.jdbc.spi.impl.HikariCPDataSourceProvider")
                .put("jdbcUrl", "jdbc:postgresql://127.0.0.1:5432/mydb")
                .put("username", "postgres")
                .put("password","password")
                .put("driverClassName", "org.postgresql.Driver")
                .put("maximumPoolSize", 30),"mypool");

如果有另外一个verticle 需要使用连接池 mypool,也必须在start方法中加入这样一段。verticle 部署的是异步的多线程环境,这个createShared方法必须是线程安全的。如果有很多程序需要使用这个连接池 mypool,就会产生大量的冗余代码,这段代码必须是线程安全的。一个可行的方案是创建一个configuration verticle,这个verticle初始化所有的共享资源。然后通过这个verticle的静态方法访问系统的所有的共享资源。这样会减少大量的冗余代码,作为单例类,也不必是线程安全的。

需要注意是 当使用 vertx.deployVerticle 部署verticle (vertx是可以理解为一个verticle的环境),不能保证verticle的运行顺序,部署是异步的。为了保证configuration verticle的在其他verticle之前运行,必须使部署过程同步。同步方法并不复杂,可以用future实现。

try {
    log.info("deploy " + verticleID);
    CompletableFuture future = new CompletableFuture();
    vertx.deployVerticle(verticleID, deploymentOptions, res -> {
    if (res.succeeded()) {
        log.info("Deployment id is: " + res.result());
        future.complete(1);
    } else {
        log.error("Deployment failed!");
        future.complete(0);
    }});
    int result = future.get();
} catch (Throwable t) {
    log.error("error", t);
}

2.异步jdbc

异步jdbc确实能够提高效率,vertx提供了基于sql 语句的异步api,下面是从vertx jdbc example 摘下来的一个例子。

// create a test table
      execute(conn.result(), "create table test(id int primary key, name varchar(255))", create -> {
        // start a transaction
        startTx(conn.result(), beginTrans -> {
          // insert some test data
          execute(conn.result(), "insert into test values(1, "Hello")", insert -> {
            // commit data
            endTx(conn.result(), commitTrans -> {
              // query some data
              query(conn.result(), "select count(*) from test", rs -> {
                for (JsonArray line : rs.getResults()) {
                  System.out.println(line.encode());
                }

                // and close the connection
                conn.result().close(done -> {
                  if (done.failed()) {
                    throw new RuntimeException(done.cause());
                  }
                });
              });
            });
          });
        });
      });
    });
  }

这是一个非常简单的事务,都需要写成这样,无法想象一个复杂事务的处理程序会变成什么样子。其实jdbc driver api依然是同步的,不过vertx提供了一个异步封装。语句级别异步api过细,如果程序员能够自己控制异步的粒度,将会改善这种情况。我的方案是提供jdbc同步api,然后程序员可以异步封装一个过程。这在vertx很容易实现。

executor.executeBlocking((Future f) -> {
      try {
          jdbc_routine();
        }
        f.complete();
      } catch (SQLException e) {
        f.fail(e);
      }
    }, handler);

小结 vertx的体系结构无疑是非常先进的,多线程异步结构,内置metrics,支持cluster,支持高可用度,这些都不是nodejs轻易能够提供的。 但是目前使用起来确实有诸多不变,需要一点hack。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64824.html

相关文章

  • vertx实现redis版session共享

    摘要:今天分享的是里的共享问题。主要考虑到清除的时候使用,因为数据主要以保存在为主,本地保存是辅助作用。 现在越来越流行微服务架构了,提到微服务架构的话,大家能想到的是spring boot和vertx吧!前者大家听的比交多些,但是今天我给大家分享的是后者vertx。想要了解更多请阅读vertx官网http://vertx.io/docs/vertx-we... 废话不多说了,直接进主题...

    fancyLuo 评论0 收藏0
  • Vert.x Blueprint 系列教程(二) | 开发基于消息应用 - Vert.x Kue

    摘要:本文章是蓝图系列的第二篇教程。这就是请求回应模式。好多属性我们一个一个地解释一个序列,作为的地址任务的编号任务的类型任务携带的数据,以类型表示任务优先级,以枚举类型表示。默认优先级为正常任务的延迟时间,默认是任务状态,以枚举类型表示。 本文章是 Vert.x 蓝图系列 的第二篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待办事项服务开发教程 Vert.x B...

    elina 评论0 收藏0
  • 次时代Java编程(一):续 vertx-sync实践

    摘要:定时器例子之前通过调用定时器,需要传一个回调,然后所有的代码逻辑都包在里面。这里定时器会阻塞在这一行,直到一秒后才会执行下面的一行。 之前介绍过quasar,如果你希望在vert.x项目里使用coroutine的话,建议使用vertx-sync。本篇将介绍vertx-sync。 showImg(/img/bVzIsu); 本来打算另起一篇,写其他方面的东西,但是最近比较忙,就先写一篇实...

    vpants 评论0 收藏0
  • 使用Vert.x构建Web服务器和消息系统

    摘要:而不是开始,将服务使用多线程的请求重量级的容器。是启动多个轻便单线程的服务器和流量路由到他们。亮点应用程序是事件驱动,异步和单线程的。通过使用事件总线传递消息通信。为了建立一个消息系统,则需要获得该事件总线。 摘要 如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度。 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x...

    DrizzleX 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<