问题描述
我不确定这是某种错误还是我身边缺少的配置,但是我得到了不同的行为,Vertx eventBus 将线程分配给“@ConsumeEvent”方法。
在 Quarkus 1.13.7.FINAL 及更早版本中,如果池中有足够的线程,Vertx 会为每个消费者方法绑定一个 eventloop 线程。但是在 Quarkus 2.0.0 中,每条消息都由一两个线程处理,这使得执行实际上是同步的。这种行为在 VM 或本机模式下是相同的。
我做了一个愚蠢的项目来说明这一点:https://github.com/AngelPerz/test-vertx-q2
在这个项目中,当收到对 localhost:8080/test 的调用时,它通过 eventBus 将一些消息发送给 3 个使用 .publish() 方法的消费者,模拟每个消费者的一些工作一个简单的等待,并通过 eventBus 将完成发送到最终收集器。
在 Quarkus 1.13.7.FINAL 中的这种情况下,同一应用程序并发执行所有内容:
2021-07-04 14:18:44,597 INFO [io.quarkus] (main) code-with-quarkus 1.0.0-SNAPSHOT native (powered by Quarkus 1.13.7.Final) started in 0.008s. Listening on: http://0.0.0.0:8080
2021-07-04 14:18:44,598 INFO [io.quarkus] (main) Profile prod activated.
2021-07-04 14:18:44,598 INFO [io.quarkus] (main) Installed features: [cdi,mutiny,resteasy,smallrye-context-propagation,vertx]
2021-07-04 14:18:50,082 INFO [org.acm.con.TestLauncher] (vert.x-eventloop-thread-17) Starting test with [5] workUnits
2021-07-04 14:18:50,082 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: starting workUnit [0]
2021-07-04 14:18:50,082 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: starting workUnit [0]
2021-07-04 14:18:50,082 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: starting workUnit [0]
2021-07-04 14:18:50,233 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: finished workUnit [0]
2021-07-04 14:18:50,233 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerC,0]
2021-07-04 14:18:50,233 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: finished workUnit [0]
2021-07-04 14:18:50,233 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: finished workUnit [0]
2021-07-04 14:18:50,233 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerB,233 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerA,233 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: all works completed by consumers for workUnit [0]
2021-07-04 14:18:50,283 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: starting workUnit [1]
2021-07-04 14:18:50,283 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: starting workUnit [1]
2021-07-04 14:18:50,283 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: starting workUnit [1]
2021-07-04 14:18:50,435 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: finished workUnit [1]
2021-07-04 14:18:50,435 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: finished workUnit [1]
2021-07-04 14:18:50,435 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: finished workUnit [1]
2021-07-04 14:18:50,435 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerC,1]
2021-07-04 14:18:50,435 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerA,435 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerB,435 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: all works completed by consumers for workUnit [1]
2021-07-04 14:18:50,483 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: starting workUnit [2]
2021-07-04 14:18:50,483 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: starting workUnit [2]
2021-07-04 14:18:50,483 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: starting workUnit [2]
2021-07-04 14:18:50,633 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: finished workUnit [2]
2021-07-04 14:18:50,634 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerC,2]
2021-07-04 14:18:50,634 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: finished workUnit [2]
2021-07-04 14:18:50,634 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: finished workUnit [2]
2021-07-04 14:18:50,634 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerB,634 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerA,634 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: all works completed by consumers for workUnit [2]
2021-07-04 14:18:50,684 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: starting workUnit [3]
2021-07-04 14:18:50,684 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: starting workUnit [3]
2021-07-04 14:18:50,684 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: starting workUnit [3]
2021-07-04 14:18:50,835 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: finished workUnit [3]
2021-07-04 14:18:50,836 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: finished workUnit [3]
2021-07-04 14:18:50,836 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerC,3]
2021-07-04 14:18:50,836 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerB,836 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: finished workUnit [3]
2021-07-04 14:18:50,837 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerA,837 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: all works completed by consumers for workUnit [3]
2021-07-04 14:18:50,884 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: starting workUnit [4]
2021-07-04 14:18:50,884 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: starting workUnit [4]
2021-07-04 14:18:50,884 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: starting workUnit [4]
2021-07-04 14:18:51,035 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-16) ConsumerC :: finished workUnit [4]
2021-07-04 14:18:51,035 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-18) ConsumerA :: finished workUnit [4]
2021-07-04 14:18:51,035 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerC,4]
2021-07-04 14:18:51,035 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerA,035 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-14) ConsumerB :: finished workUnit [4]
2021-07-04 14:18:51,037 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: received finish work [ConsumerB,037 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-15) WorkCollector :: all works completed by consumers for workUnit [4]
我们可以看到有 5 个不同的线程在执行测试,但是在 Quarkus 2.0.0.FINAL 中运行相同的代码时,只有一个线程在执行所有操作:
2021-07-04 13:27:54,523 INFO [io.quarkus] (main) code-with-quarkus 1.0.0-SNAPSHOT native (powered by Quarkus 2.0.0.Final) started in 0.007s. Listening on: http://0.0.0.0:8080
2021-07-04 13:27:54,524 INFO [io.quarkus] (main) Profile prod activated.
2021-07-04 13:27:54,524 INFO [io.quarkus] (main) Installed features: [cdi,vertx]
2021-07-04 13:28:03,630 INFO [org.acm.con.TestLauncher] (vert.x-eventloop-thread-0) Starting test with [5] workUnits
2021-07-04 13:28:04,632 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: starting workUnit [0]
2021-07-04 13:28:04,784 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: finished workUnit [0]
2021-07-04 13:28:04,784 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: starting workUnit [0]
2021-07-04 13:28:04,940 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: finished workUnit [0]
2021-07-04 13:28:04,940 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: starting workUnit [0]
2021-07-04 13:28:05,091 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: finished workUnit [0]
2021-07-04 13:28:05,091 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: starting workUnit [1]
2021-07-04 13:28:05,242 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: finished workUnit [1]
2021-07-04 13:28:05,242 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: starting workUnit [1]
2021-07-04 13:28:05,395 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: finished workUnit [1]
2021-07-04 13:28:05,395 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: starting workUnit [1]
2021-07-04 13:28:05,548 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: finished workUnit [1]
2021-07-04 13:28:05,549 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: starting workUnit [2]
2021-07-04 13:28:05,702 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: finished workUnit [2]
2021-07-04 13:28:05,702 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: starting workUnit [2]
2021-07-04 13:28:05,854 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: finished workUnit [2]
2021-07-04 13:28:05,854 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: starting workUnit [2]
2021-07-04 13:28:06,005 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: finished workUnit [2]
2021-07-04 13:28:06,006 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: starting workUnit [3]
2021-07-04 13:28:06,158 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: finished workUnit [3]
2021-07-04 13:28:06,158 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: starting workUnit [3]
2021-07-04 13:28:06,310 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: finished workUnit [3]
2021-07-04 13:28:06,310 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: starting workUnit [3]
2021-07-04 13:28:06,461 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: finished workUnit [3]
2021-07-04 13:28:06,461 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: starting workUnit [4]
2021-07-04 13:28:06,611 INFO [org.acm.con.ConsumerB] (vert.x-eventloop-thread-0) ConsumerB :: finished workUnit [4]
2021-07-04 13:28:06,611 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: starting workUnit [4]
2021-07-04 13:28:06,761 INFO [org.acm.con.ConsumerC] (vert.x-eventloop-thread-0) ConsumerC :: finished workUnit [4]
2021-07-04 13:28:06,762 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: starting workUnit [4]
2021-07-04 13:28:06,915 INFO [org.acm.con.ConsumerA] (vert.x-eventloop-thread-0) ConsumerA :: finished workUnit [4]
2021-07-04 13:28:06,915 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: received finish work [ConsumerB,0]
2021-07-04 13:28:06,915 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: received finish work [ConsumerC,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: received finish work [ConsumerA,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: all works completed by consumers for workUnit [0]
2021-07-04 13:28:06,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: received finish work [ConsumerB,1]
2021-07-04 13:28:06,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: received finish work [ConsumerC,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: all works completed by consumers for workUnit [1]
2021-07-04 13:28:06,2]
2021-07-04 13:28:06,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: all works completed by consumers for workUnit [2]
2021-07-04 13:28:06,3]
2021-07-04 13:28:06,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: all works completed by consumers for workUnit [3]
2021-07-04 13:28:06,4]
2021-07-04 13:28:06,916 INFO [org.acm.con.TestWorkCollector] (vert.x-eventloop-thread-0) WorkCollector :: all works completed by consumers for workUnit [4]
1.13.7.FINAL 中的执行时间差为 955ms,2.0.0.FINAL 中为 2592ms;如果它可以相关,则使用 GraalVM 21.0.0.2 java11 进行测试
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)