disruptor-pattern - Disruptor - 消费者是多线程的吗?

标签 disruptor-pattern lmax

我对干扰器有以下疑问:

  1. 消费者(事件处理器)没有实现他们实现EventHandler的任何Callable或Runnable接口(interface),那么他们如何并行运行, 例如,我有一个扰乱器实现,其中有一个像这样的菱形图案
     c1
P1 - c2 - c4 - c5
     c3

Where c1 to c3 can work in parallel after p1, and C4 and C5 work after them.

So conventionally I'd have something like this (with P1 and C1-C5 being runnables/callables)

p1.start();
p1.join();

c1.start();
c2.start();
c3.start();
c1.join();
c2.join();
c3.join();

c4.start();
c4.join();
c5.start();
c5.join();

但是对于 Disruptor,我的事件处理程序都没有实现 Runnable 或 Callable,那么 Disruptor 框架最终是如何并行运行它们的呢?

采取以下场景:

我的消费者 C2 需要对事件进行一些注释进行 Web 服务调用,在 SEDA 中,我可以为这 10 个 C2 请求启动 10 个线程 [用于将消息从队列中拉出 + 进行 Web 服务调用并更新下一个 SEDA 队列]这将确保我不会依次等待 10 个请求中每个请求的 Web 服务响应 在本例中,我的事件处理器 C2(如果)是单个实例,将按顺序等待 10 个 C2 请求。

最佳答案

你的EventHandler被组成一个BatchEventProcessor的实例,它是一个Runnable。

  • BatchEventProcessor 实现 run() 循环。
  • 它负责从环形缓冲区中获取更新的事件序列号。
  • 当事件可供处理时,它将它们传递给您的 EventHandler 进行处理。

使用 DSL 时,Disruptor 负责通过 Executor 实例创建这些线程。

  • 您在 Disruptor 构造函数中提供一个 Executor。
  • 您在 DSL 上使用 and/then/etc 提供事件处理程序列表。
  • 然后,调用 Disruptor start() 方法。作为 start() 方法的一部分,每个 EventProcessor(可运行)都被提交给 Executor。
  • 执行器将依次在线程上启动您的 EventProcessor/EventHandler。

关于您的具体场景(即:长时间运行的事件处理程序),您可以引用这个问题:

关于disruptor-pattern - Disruptor - 消费者是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019203/

相关文章:

java - Disruptor - 环形缓冲区

java - 干扰者一个事件处理程序停止其他事件处理程序

java - 干扰者 : setting EventHandler order

java - LMAX Disruptor 事件中的类字段是否需要可变?

java - 如何将 LMAX 集成到真实的金融应用程序中

java - 用单线程写 LMAX

eventhandler - 为什么 lmax 干扰器架构使用 2 个干扰器?

disruptor-pattern - 在干扰器中使用 TimeoutBlockingWaitStrategy 时出现空指针异常

python-3.x - Python 中的 LMAX 干扰器

c++ - 在类似 LMAX 破坏者的模式中,您如何处理缓慢的消费者?