问题标签 [disruptor-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
96 浏览

scala - Disruptor – 未调用的最后一个处理程序

我正在使用 Scala 的 Disruptor,有一个奇怪的问题:链中的最后一个处理程序(无论它是哪个处理程序或链有多长)没有被调用。这就是我正在做的事情:

在调试器中,我可以看到最后一个处理程序已添加到消费者存储库,但不知何故从未调用 onEvent。我正在使用 CachedThreadPool 执行器。

我怎样才能使这项工作?

0 投票
2 回答
676 浏览

java - 破坏者一个事件处理程序停止其他事件处理程序

我正在使用以下事件处理程序运行中断实例:

我发现了一个 Replicator() 线程挂起并阻塞 Logic() 线程的实例。

如果环形缓冲区中有 1 个事件,中断线程是否按顺序工作?

0 投票
1 回答
755 浏览

java - Disruptor - 环形缓冲区

我正在研究LMAX Disruptor 的源代码,我进入了RingBuffer抽象类。为什么里面正好有 7 个长字段 (p1 ... p7) RingBufferPad?这是实际代码: https ://github.com/LMAX-Exchange/disruptor/blob/master/src/main/java/com/lmax/disruptor/RingBuffer.java

0 投票
1 回答
116 浏览

java - 为什么 RingBuffer 的 getBufferSize() 是 int 而剩余容量() 是 long?

我正在编写一些单元测试代码,并且需要知道发布到破坏者的环形缓冲区的所有事件都已处理(如上所述,它仅适用于特定的测试用例)。

在研究了几个小时并没有找到任何优雅的解决方案后,我决定在测试用例中使用以下代码:

它似乎有效,但由于getBufferSize()返回 anintremainingCapacity()返回 along我担心我忽略了一些东西。

任何人都知道为什么getBufferSize()返回一个intremainingCapacity()返回一个long?这对我来说没有意义,除非它是一个错误。

0 投票
1 回答
632 浏览

java - 用于测试目的的同步模式干扰器

为了对包含中断器的某些代码进行单元测试,我需要确保在主测试线程继续之前发布到中断器的事件得到处理(显然,我没有测试中断器代码)。

在没有更优雅的解决方案的情况下,我克服了如下问题:

但是,我想知道是否有某种方法可以将中断器设置为“同步模式”(我看了但找不到),或者可以使用“同步模拟中断器”实现来确保线程不会publish()在所有事件都被处理之前返回onEvent()

0 投票
1 回答
281 浏览

producer-consumer - 破坏者生产者对消费者来说太快了

我正在为某些业务逻辑使用中断器,这些逻辑会发布到另一个处理 IO 的中断器。发布到 IO 中断器的事件可能到达太快,无法构建和验证 IO。嗯,这就是重点……

IO 中断器的设置如下:

然后逻辑事件处理程序设置如下:

正在发生的事情是,当您发送 (ioMessage) 时,有一个新事件以某种方式覆盖了 ioMessage,因此重复的消息被发送出去。

你有什么建议?

0 投票
1 回答
66 浏览

java - 破坏者事件可见性

我正在制作一个在 Disruptor ( https://github.com/LMAX-Exchange/disruptor/wiki )之上创建演员模型的原型。根据所有示例,事件的突变不使用 volatile 或任何其他方式来确保保留可见性。我想知道是什么让这很安全?

在常见问题解答中,这听起来像是已处理(https://github.com/LMAX-Exchange/disruptor/wiki/Frequently-Asked-Questions#do-you-relax-the-consistency-model-to-gain -performance)但我还没有看到如何。

感谢您花时间阅读本文!

0 投票
1 回答
107 浏览

disruptor-pattern - 中断事件处理程序

在 onEvent 的各种示例中,有时变量被声明为 final,有时则不是。

例如:

反对

请我对final的原因和使用发表评论吗?

0 投票
1 回答
163 浏览

java - 对于 java 同步锁,disruptor onEvent 处理程序似乎太快了

我同时将 2 个或更多不同的事件发布到输出中断器(一个接一个),并且中断器 onEvent 通常只将最后一个要发布的事件发送到 IO 会话。基本上,事件数据被覆盖。而我想在会话层上查看每个事件的副本。我曾尝试在锁上同步会话层,但即使对于锁,发布者通常仍然太快(有时它正在工作,但大多数时候它不是)。

这是一些代码:

这有发生在其他人身上吗?除了发布者的减速带之外,还有其他解决方案吗?

这是生产者代码:

0 投票
1 回答
1158 浏览

java - 使用中断器和执行器在 Java 中设计 Orchestrator

我们正在用 Java 设计一个 Orchestrator 系统,它将托管一个 Web 服务,并根据对它的请求调用一个用 XML 编写的流,这些流只不过是一个接一个地执行的步骤,但 XML 告诉用户流是什么,他还可以通过更改 XML 来更改流程。他可以添加新服务并将其添加到 XML。但是在设计时,我现在对诸如此类的事情感到困惑。

  1. 我是否应该使用阻塞队列使服务成为可运行的,并通过将其调度到执行程序来使其始终保持活动状态,这样当新请求到达时,我会将请求推送到阻塞队列中,并且服务将处理它。并创建一个邮箱来承载不同服务之间的消息传递任务。

  2. 我应该使用spring IOC而不是使服务可运行,这将使类单例,因此只有一个实例存在,我将直接向服务方法发送请求,因此我不必做任何麻烦,因为没有线程也不需要实现任何邮箱。

  3. 我读到了事件驱动系统如何像 nodejs 和 ngnix 一样更快,所以我想使用 disuptor 框架将所有传入的请求推送到 ringbuffer,然后编写一个处理程序,将事件发送到将开始处理请求的协调器和还与请求一起发送回调,以便当协调器完成时,它将使用回调将响应发回给调用者。但是由于请求的类型不同,所以我将无法利用中断对象分配。

系统需要以低延迟提供最大吞吐量,系统将来会向 XML 添加新的服务/流,因此它应该在不影响性能的情况下采用新的流。我只能使用 java 7,没有 Scala,所以我是有界的。