问题标签 [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.
disruptor-pattern - 在池中使用两层多个处理程序时的破坏者性能问题
我正在尝试使用中断器来处理消息。我需要两个处理阶段。即两组处理程序在这样的工作池中工作(我猜):
使用上面的代码时,如果我在每组中放置一个以上的工人,性能会下降。意味着大量的 CPU 浪费在完全相同的工作量上。
我试图调整环形缓冲区的大小(我已经看到这对性能有影响),但在这种情况下它没有帮助。所以我做错了什么,还是这是一个真正的问题?
我附上了这个问题的完整演示。
尝试在每个组中使用 1 个线程运行上述示例
在我的电脑上它给了
然后用每组4个线程试试
在我的电脑上给了
在运行期间 CPU 的利用率为 100%
message-queue - 使用多个 LMAX Disruptor
我是 LMAX Disruptor 的新手,我正在探索在需要处理大量流量的多层异步项目中使用它。
向平台发送请求以发送 SMS,清除/检查请求是否存在简单错误并记录下来。
获取和分析与发送 SMS 的客户端相关的各种其他信息,并将其他参数添加到 SMS 信息中。
分析并选择正确的路由路径。然后根据 SMS-info 设置平台特定的协议参数并将其提交给路由器。
像这样,将有接收和处理 SMS 传递以记录、计费、重试和许多其他的流程。在每个阶段,程序流程中都会有并发或顺序执行。如果这是项目的高级视图,是否应使用 LMAX 中断器框架在各个模块之间进行通信(短信信息)?
如果是这样,需要创建多少中断器的右缓冲区?
如果我的理解是正确的,是否在不同的每个层/功能之间创建了新的环形缓冲区?
可以将 POJO 对象写入 ringbuffer 吗?如何将其应用于集群环境?尽管我阅读了一些文档并看过一些有关此框架的视频,但我无法使用此框架可视化解决方案。
任何指南/示例/可视图表/文档或您对此的想法都会对我有很大帮助。
disruptor-pattern - LMAX Disruptor:必须 EventHandler 克隆从 EventHandler#onEvent 接收的对象
我有一个包含许多生产者和消费者的应用程序。
据我了解,RingBuffer 在 RingBuffer init 开始时创建对象,然后在 Ring 中发布时复制对象并在 EventHandler 中从中获取它们。
我的应用程序 LogHandler 在列表中缓冲接收到的事件,以便在列表达到一定大小后进一步以批处理模式发送。因此 EventHandler#onEvent 将接收到的对象放入列表中,一旦达到大小,它就会在 RMI 中将其发送到服务器并清除它。
我的问题是,我是否需要在放入列表之前克隆对象,据我所知,一旦使用它们就可以重复使用?
我是否需要同步对 EventHandler#onEvent 中列表的访问?
java - 在 Java Servlet 中使用中断器并处理多个事件
我在我的 Web 应用程序中使用 LMAX 中断器,它接受 http 请求参数并将它们处理到环形缓冲区。3 个事件处理程序处理和处理数据,最后一个将其保存到数据库中。当 servlet 被实例化时,初始化一次 ringbuffer。这是正确的吗?
在这里,我将值直接放入 ringbuffer
事件处理程序
这是发布到环形缓冲区的正确方法吗?我需要同步“ringBuffer”对象吗?前 2 个事件并行运行,然后是第 3 个事件。当我有快速的发布者和缓慢的消费者时,我应该如何处理这个问题?我正在使用disruptor 3.1.1,我在web 环境中找不到很好的disruptor 使用示例。一个简单的代码实现,如果你做过,会帮助我理解很多!
java - 如果 Disruptor 中的 next() 和 publish() 之间抛出异常会发生什么?
如果在使用之间next()
和publish()
使用时抛出异常,Disruptor
或者publish()
由于其他原因或在可接受的时间内没有被调用,会发生什么?
处理此类情况的恢复/超时技术是什么?
java - 如何在 Disruptor 中创建自定义事件处理器?
我希望在 Disruptor 中创建一个自定义 EventProcessors,但文档非常少。(https://code.google.com/p/disruptor/wiki/DisruptorWizard)这是怎么做的。它背后的概念是什么,问题和陷阱是什么?
synchronization - Disruptor,同步机制
当有 N 个生产者和 1 个消费者时,破坏者队列是否提供卓越的性能?我使用 Disruptor Queues 编写了一个包含多个生产者和单个消费者的程序。我发现结果与阻塞 arraybounded 队列并驾齐驱。后者表现更好。我在这里做错了吗?
}
java - ByteBuffer.putLong 使用非本地 ByteOrder 快 2 倍
尽管广泛阅读了 JDK 源代码并检查了内在例程,但我还是无法一概而论。
我正在测试清除 a ByteBuffer
,分配给allocateDirect
using ByteBuffer.putLong(int index, long value)
。根据 JDK 代码,如果缓冲区是“本机字节顺序”,则这会导致单个 8 字节写入,或者字节交换,如果不是,则随后是相同的。
所以我希望本机字节顺序(对我来说是小端)至少与非本机一样快。然而,事实证明,非本机的速度要快约 2 倍。
这是我在 Caliper 0.5x 中的基准:
结果是:
这是一致的。如果我换成putLong
,putFloat
本地订单的速度大约快 4 倍。如果你看看它是如何putLong
工作的,它在非本地情况下做了更多的工作:
请注意,unaligned
在任何一种情况下都是如此。本机和非本机字节顺序之间的唯一区别是Bits.swap
有利于本机情况(小端)。
java - 扰乱消费者重新提交数据
我想使用 LMAX 的破坏者,但我不确定我的用例是否适合它。基本上有一个或 2 个生产者和 n 个消费者。诀窍是,当消费者接收到一个事件并检查其中的一些数据时,如果它不能立即使用它,它必须重新发布数据(它基本上是一个轮询方案)。我创建了容量我不担心的环形缓冲区太小,但现在我的问题是:请求新序列并从事件处理程序发布是否安全,或者这会以某种方式破坏功能?通过一个小测试,我使这看起来足够安全,但我不知道它在我的特定情况下会如何表现。我担心 onEvent 方法可能会在我请求序列之后但在我更新-> 发布新对象之前被调用,我真的不知道破坏者如何处理这些情况