成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vertx的一些問題

MRZYD / 1227人閱讀

摘要:但經過一段使用后,發(fā)現(xiàn)的一些問題。這樣產生了一系列問題。部署的是異步的多線程環(huán)境,這個方法必須是線程安全的。小結的體系結構無疑是非常先進的,多線程異步結構,內置,支持,支持高可用度,這些都不是輕易能夠提供的。

最近想選高效,簡潔,擴充性強的web框做為移動平臺后臺,在對一系列框架對比后,選擇了vertx。但經過一段使用后,發(fā)現(xiàn)vertx的一些問題。

1.vertx使用共享資源產生的重復代碼

在vertx中,verticle是最基本的結構,簡單的說類似j2ee servlet,但是verticle更加靈活,不僅可以是服務,也可是客戶端,verticle之間通過eventbus通訊,實際上更類似akka的actor,vertx實現(xiàn)了類似nodejs express風格的web框架,但是java是多線程的,通常java的面向的目標環(huán)境更復雜。這樣產生了一系列問題。
如jdbc連接池,在創(chuàng)建的時候必須在 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 部署的是異步的多線程環(huán)境,這個createShared方法必須是線程安全的。如果有很多程序需要使用這個連接池 mypool,就會產生大量的冗余代碼,這段代碼必須是線程安全的。一個可行的方案是創(chuàng)建一個configuration verticle,這個verticle初始化所有的共享資源。然后通過這個verticle的靜態(tài)方法訪問系統(tǒng)的所有的共享資源。這樣會減少大量的冗余代碼,作為單例類,也不必是線程安全的。

需要注意是 當使用 vertx.deployVerticle 部署verticle (vertx是可以理解為一個verticle的環(huán)境),不能保證verticle的運行順序,部署是異步的。為了保證configuration verticle的在其他verticle之前運行,必須使部署過程同步。同步方法并不復雜,可以用future實現(xiàn)。

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很容易實現(xiàn)。

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

小結 vertx的體系結構無疑是非常先進的,多線程異步結構,內置metrics,支持cluster,支持高可用度,這些都不是nodejs輕易能夠提供的。 但是目前使用起來確實有諸多不變,需要一點hack。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/64824.html

相關文章

  • vertx實現(xiàn)redis版session共享

    摘要:今天分享的是里的共享問題。主要考慮到清除的時候使用,因為數(shù)據(jù)主要以保存在為主,本地保存是輔助作用。 現(xiàn)在越來越流行微服務架構了,提到微服務架構的話,大家能想到的是spring boot和vertx吧!前者大家聽的比交多些,但是今天我給大家分享的是后者vertx。想要了解更多請閱讀vertx官網(wǎng)http://vertx.io/docs/vertx-we... 廢話不多說了,直接進主題...

    fancyLuo 評論0 收藏0
  • Vert.x Blueprint 系列教程(二) | 開發(fā)基于消息應用 - Vert.x Kue

    摘要:本文章是藍圖系列的第二篇教程。這就是請求回應模式。好多屬性我們一個一個地解釋一個序列,作為的地址任務的編號任務的類型任務攜帶的數(shù)據(jù),以類型表示任務優(yōu)先級,以枚舉類型表示。默認優(yōu)先級為正常任務的延遲時間,默認是任務狀態(tài),以枚舉類型表示。 本文章是 Vert.x 藍圖系列 的第二篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待辦事項服務開發(fā)教程 Vert.x B...

    elina 評論0 收藏0
  • 次時代Java編程(一):續(xù) vertx-sync實踐

    摘要:定時器例子之前通過調用定時器,需要傳一個回調,然后所有的代碼邏輯都包在里面。這里定時器會阻塞在這一行,直到一秒后才會執(zhí)行下面的一行。 之前介紹過quasar,如果你希望在vert.x項目里使用coroutine的話,建議使用vertx-sync。本篇將介紹vertx-sync。 showImg(/img/bVzIsu); 本來打算另起一篇,寫其他方面的東西,但是最近比較忙,就先寫一篇實...

    vpants 評論0 收藏0
  • 使用Vert.x構建Web服務器和消息系統(tǒng)

    摘要:而不是開始,將服務使用多線程的請求重量級的容器。是啟動多個輕便單線程的服務器和流量路由到他們。亮點應用程序是事件驅動,異步和單線程的。通過使用事件總線傳遞消息通信。為了建立一個消息系統(tǒng),則需要獲得該事件總線。 摘要 如果你對Node.js感興趣,Vert.x可能是你的下一個大事件:一個建立在JVM上一個類似的架構企業(yè)制度。 這一部分介紹Vert.x是通過兩個動手的例子(基于Vert.x...

    DrizzleX 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<