博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vertx的一些问题
阅读量:5970 次
发布时间:2019-06-19

本文共 3135 字,大约阅读时间需要 10 分钟。

最近想选高效,简洁,扩充性强的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。

转载地址:http://enzox.baihongyu.com/

你可能感兴趣的文章
非GUI模式运行Jmeter脚本
查看>>
ES搭建
查看>>
7、字典和string的用法
查看>>
pointer 学习 之 swap
查看>>
Ubuntu 上 Node.js 安装和卸载
查看>>
11.前台文件数据流下载获取源文件名
查看>>
安装MySQL
查看>>
BZOJ 4827 [Hnoi2017]礼物 ——FFT
查看>>
【转】如何在忘记CentOS的root密码的情况下修改root密码。
查看>>
spring 获取 WebApplicationContext的几种方法
查看>>
java中一些对象(po,vo,dao,pojo)等的解释
查看>>
移动端Web开发调试之Chrome远程调试(Remote Debugging)
查看>>
第四次作业
查看>>
sql常用语句
查看>>
OIer同样是音乐家
查看>>
JQury自动切换图片
查看>>
Uva 11732 strcmp()函数
查看>>
浅拷贝与深拷贝
查看>>
(转)所有iOS设备的屏幕分辨率
查看>>
三年从前端小工到架构-知乎 Live 学习整理
查看>>