Vert.x: 如何在整个工作线程池中处理事件序列?

问题描述 投票:0回答:1

我的问题是:如果我在事件循环线程中接收到多个事件序列,如何将每个序列阻塞和有序地处理,但不同的序列由整个工作线程池处理。

如果我在事件循环线程中接收到多个事件序列,我如何处理每一个序列,并有序地将不同的序列由整个工作线程池处理。

用例。

我有一个vert.x的gRPC客户端,有4个事件循环和20个工作线程。我在10个线程中启动远程调用。

  • 每个调用都会收到2个事件 StreamObserver.onNextStreamObserver.onCompleted
  • 在每一个这样的事件中,我都想以这样的方式启动阻塞任务,即对于一个gRPC调用 在下一个在关闭时是有序的,而对于不同的gRPC调用,事件是在不同的工作线程上执行的。

我们的目标是将调用的执行分配给尽可能多的工作线程,但单个调用的事件是有序的。

  • 如果我使用 执行阻塞 有序 真正 - 它们将在每个事件线程的工作线程中执行。
  • 如果 假的 - 无序处理 在下一个在关闭时.
vert.x
1个回答
0
投票

我认为这对Kafka来说是一个很好的用例。

你可以继续用一个worker pool工作,每个线程都用消费者创建和监听kafka。而不是一个工作池,你也可以在同一个java进程中实例化多个顶点,甚至是多个jvm实例(甚至是容器,为什么不:p)。我更喜欢第二种方法来处理事件驱动和分布式架构中的动态可扩展性(我在 "事件驱动和分布式架构 "中写了更多的细节)。本回答).

无论哪种方式,所有的消费者都需要用同样的方式来实现。group.id 来成为同一组消费者的一部分。这样一来,kafka就能够将话题的分区分配给每个组的成员(一个分区不能被两个成员同时读取)。

最后要能够创建 "事件序列",你只需要在kafka主题中用一个分配密钥来生产事件,这个分配密钥将定义你的序列(用相同的分配密钥生产的两个消息将被存储在同一个分区中,并将被该组的同一个消费者读取)。

© www.soinside.com 2019 - 2024. All rights reserved.