前提知識
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 消息處理系統:
需要注意:
1. 如果executor.executeBlocking用Worker Verticles來替代的話
a,需要考慮併發事務問題
b,deploy和undeploy Worker Verticle需要處理,額外浪費cpu處理