Vertx執行阻塞代碼

前提知識

Verticle類型:
1. Standard Verticles:會被eventloop線程執行,Verticle內的異步回調Handler也會被同一個eventloop線程來執行,所以同一個Verticle的所有的異步回調Handler會被順序執行
2. Worker Verticles:會被Worker 線程池中的任意一個線程執行,同時Verticle內的異步回調Handler也會被Worker 線程池中的任意一個線程執行,和Standard Verticles一樣,同一個Verticle的所有的異步回調Handler也會被順序執行,這是由vertx來保證的
3. Multi-threaded worker verticles:會被併發執行的Verticle,不做過多討論

Vertx執行阻塞代碼的方法:
1. 通過worker pool來直接執行:
a,同一個Verticle調用此方法,所有阻塞代碼塊會被順序執行,對於操作redis或者db的時候,可以省去事務的事務。
b,阻塞代碼塊內的回調handler會被註冊到Verticle的線程上,而不是worker pool的線程。所以如果是Standard Verticle,阻塞代碼塊會被worker pool的線程執行,但是阻塞代碼塊內的回調handler會被Standard Verticle的eventloop線程來執行,有可能造成eventloop阻塞。
c, 所以說用這種寫法的話,阻塞代碼塊內應該都是同步處理,不應該再有異步處理。

WorkerExecutor executor = vertx.createSharedWorkerExecutor("my-worker-pool");
executor.executeBlocking(future -> {
  // Call some blocking API that takes a significant amount of time to return
  String result = someAPI.blockingMethod("hello");
  future.complete(result);
}, res -> {
  System.out.println("The result is: " + res.result());
});

如果想要併發執行,可以加上false參數

executor.executeBlocking(future->{

}, false, res->{

});

2.通過Worker Verticles來執行:多次調用deploy Worker Verticle的話,是併發執行的

DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);

一般流程

業務流程通過Standard Verticles來實現,業務流程內的具體處理邏輯交由阻塞代碼塊執行。
比如說eventbus 消息處理系統:
eventbus 消息處理系統

需要注意:
1. 如果executor.executeBlocking用Worker Verticles來替代的話
a,需要考慮併發事務問題
b,deploy和undeploy Worker Verticle需要處理,額外浪費cpu處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章