摘要:但經(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); CompletableFuturefuture = 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((Futuref) -> { 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
摘要:今天分享的是里的共享問題。主要考慮到清除的時(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)主題...
摘要:本文章是藍(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...
摘要:定時(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í)...
摘要:而不是開始,將服務(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...
閱讀 3081·2021-11-24 10:47
閱讀 3831·2021-11-02 14:43
閱讀 2228·2021-09-26 10:15
閱讀 2254·2021-09-08 09:35
閱讀 560·2019-08-30 12:45
閱讀 2781·2019-08-29 17:04
閱讀 3214·2019-08-26 14:05
閱讀 1259·2019-08-26 12:10