国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

vertx的一些問題

MRZYD / 1213人閱讀

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

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

1.vertx使用共享資源產(chǎn)生的重復(fù)代碼

在vertx中,verticle是最基本的結(jié)構(gòu),簡單的說類似j2ee servlet,但是verticle更加靈活,不僅可以是服務(wù),也可是客戶端,verticle之間通過eventbus通訊,實(shí)際上更類似akka的actor,vertx實(shí)現(xiàn)了類似nodejs express風(fēng)格的web框架,但是java是多線程的,通常java的面向的目標(biāo)環(huán)境更復(fù)雜。這樣產(chǎn)生了一系列問題。
如jdbc連接池,在創(chuàng)建的時(shí)候必須在 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");

如果有另外一個(gè)verticle 需要使用連接池 mypool,也必須在start方法中加入這樣一段。verticle 部署的是異步的多線程環(huán)境,這個(gè)createShared方法必須是線程安全的。如果有很多程序需要使用這個(gè)連接池 mypool,就會(huì)產(chǎn)生大量的冗余代碼,這段代碼必須是線程安全的。一個(gè)可行的方案是創(chuàng)建一個(gè)configuration verticle,這個(gè)verticle初始化所有的共享資源。然后通過這個(gè)verticle的靜態(tài)方法訪問系統(tǒng)的所有的共享資源。這樣會(huì)減少大量的冗余代碼,作為單例類,也不必是線程安全的。

需要注意是 當(dāng)使用 vertx.deployVerticle 部署verticle (vertx是可以理解為一個(gè)verticle的環(huán)境),不能保證verticle的運(yùn)行順序,部署是異步的。為了保證configuration verticle的在其他verticle之前運(yùn)行,必須使部署過程同步。同步方法并不復(fù)雜,可以用future實(shí)現(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.異步j(luò)dbc

異步j(luò)dbc確實(shí)能夠提高效率,vertx提供了基于sql 語句的異步api,下面是從vertx jdbc example 摘下來的一個(gè)例子。

// 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());
                  }
                });
              });
            });
          });
        });
      });
    });
  }

這是一個(gè)非常簡單的事務(wù),都需要寫成這樣,無法想象一個(gè)復(fù)雜事務(wù)的處理程序會(huì)變成什么樣子。其實(shí)jdbc driver api依然是同步的,不過vertx提供了一個(gè)異步封裝。語句級(jí)別異步api過細(xì),如果程序員能夠自己控制異步的粒度,將會(huì)改善這種情況。我的方案是提供jdbc同步api,然后程序員可以異步封裝一個(gè)過程。這在vertx很容易實(shí)現(xiàn)。

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

小結(jié) vertx的體系結(jié)構(gòu)無疑是非常先進(jìn)的,多線程異步結(jié)構(gòu),內(nèi)置metrics,支持cluster,支持高可用度,這些都不是nodejs輕易能夠提供的。 但是目前使用起來確實(shí)有諸多不變,需要一點(diǎn)hack。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64824.html

相關(guān)文章

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

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

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

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

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

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

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

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

    DrizzleX 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<