我对干扰器有以下疑问:
- 消费者(事件处理器)没有实现他们实现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/