问题标签 [lmax]
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.
multithreading - LMAX Disruptor Timeout EventHandler
我们有一个使用 Disruptor 框架的系统,它有五个注册阶段实现 EvenetHandler。
阶段按顺序工作,因此只有在第一阶段完成后,请求才能移动到第二阶段,这种移动由 Disruptor 内部维护。
我们在第三阶段遇到了问题,这是一个瓶颈,需要花费大量时间,因为它会进行不同的 HTTP 调用并将响应存储在请求对象中。
因此,在第三阶段花费了一段时间后,我们希望将请求(无论它有什么响应)提前到第四和第五阶段。
我如何使任何特定阶段(在这种情况下为第三阶段)超时并强制将请求移至下一阶段?
或者,
有没有办法注册一些在定义的超时后触发的事件,这可能类似于系统级超时?
java - 我没有看到 Disruptor 的性能提升
我知道我的问题违背了 Disruptor API 的基本主张。但是当我了解它时,我编写了一个程序来替换我使用 ArrayLinkedBlockingQueue 的 1P-1C 用例。但是当我运行程序时,我一直在使用中断器获得比 ArrayLinkedBlockingQueue 更差的总时间。我一定是做错了什么或测量错了,但我不确定它在我的程序中是什么。有人有意见吗?
(这是一个测试程序,所以显然我的 EventHandler 没有做任何事情)
disruptor-pattern - 应用程序中的最大中断数
使用 LMAX Disruptor,我们观察到,如果我们在一个应用程序中一起使用 5-10 个干扰器(有点像一个干扰器链,每个干扰器都有一个消费者执行指定的任务,然后将消息移交给下一个干扰器/ ringbuffer), 发生的情况是 CPU 利用率达到 90% 及以上,系统变得无响应,直到我们关闭应用程序,我们觉得这是因为有这么多活跃的中断线程。即使破坏者没有真正处理任何事情,也会发生这种情况。任何人都可以评论在应用程序中使用的最佳干扰器数量是多少?
replication - LMAX Replicator Design - 如何支持高可用性?
LMAX Disruptor 通常使用以下方法实现:
如本例所示,Replicator 负责将输入事件\命令复制到从节点。跨一组节点进行复制需要我们应用共识算法,以防我们希望系统在出现网络故障、主故障和从故障时可用。
我正在考虑将 RAFT 共识算法应用于这个问题。一项观察是:“RAFT 要求在复制期间将输入事件\命令存储到磁盘(持久存储)”(参考此链接)
这种观察本质上意味着我们无法执行内存复制。因此,我们可能必须结合复制器和日志器的功能才能成功地将 RAFT 算法应用于 LMAX。
有两种方法可以做到这一点:
选项 1:使用复制的日志作为输入事件队列
- 接收者将从网络读取并将事件推送到复制的日志而不是环形缓冲区
- 一个单独的“阅读器”可以从日志中读取并将事件发布到环形缓冲区。
- 可以使用 RAFT 跨节点复制日志。我们不需要复制器和日志器,因为功能已经由 RAFT 的复制日志完成
我认为这个选项的一个缺点与我们做了一个额外的数据复制步骤(接收器到事件队列而不是环形缓冲区)有关。
选项 2:使用 Replicator 将输入事件\命令推送到从属的输入日志文件
我想知道 Replicator 的设计是否还有其他解决方案?人们为复制器采用了哪些不同的设计选项?特别是任何可以支持内存复制的设计?
c++ - 在类似 LMAX 的破坏者模式中,您如何处理缓慢的消费者?
我有一个问题,如果在 x86 Linux 上运行多个生产者和单个消费者的 lmax 破坏者(如环形缓冲区)中的消费者缓慢,该怎么办。使用类似环形缓冲区的 lmax 模式,您会不断地覆盖数据,但如果消费者速度很慢怎么办。因此,您如何处理在 10 大小的环形缓冲区 0-9 环形槽中,您的消费者位于槽 5 并且现在您的编写者已准备好开始写入槽 15,这也是缓冲区中的槽 5(即:槽5 = 15 % 10)? 处理此问题的典型方法是什么,使得编写者仍然按传入的顺序生成数据,而客户端将以相同的顺序接收数据?这真的是我的问题。下面是关于我的设计的一些细节,它工作正常,只是我目前没有一个好的方法来处理这个问题。
设计细节
我有一个环形缓冲区,设计目前有多个生产者线程和一个消费者线程。这部分设计是存在的,目前无法更改。我正在尝试使用无锁环形缓冲区删除现有的排队系统。我所拥有的如下。
代码在 x86 Linux 上运行,编写器运行多个线程,读取器运行单个线程。读取器和写入器从一个插槽开始,并且是,因此读取器从插槽 0 开始,写入器从插槽 1 开始,然后每个写入器首先通过调用如下所示的方法对写入器序列执行原子操作,然后使用 compare_and_swap 循环std::atomic<uint64_t>
来声明一个插槽要更新阅读器序列以让客户端知道此插槽可用,请参阅.fetch_add(1, std::memory_order::memory_order_acq_rel)
incrementSequence
updateSequence
excel - 如何将特定价格和数量数据从 LMAX 2 级小部件导出到 excel
背景 - 我不是程序员。我在日内交易现货外汇。我愿意学习编程
特定查询 - 我想知道如何Excel实时导出到 LMAX 2 级小部件/框架上显示的“书顶”价格和数量数据 - https://s3-eu-west-1.amazonaws。 com/lmax-widget/website-widget-quote-prof-flex.html?a=rTWcS34L5WRQkHtC
本质上我正在寻找出口
- 出现彩色闪烁的价格和数量数据。
- 没有出现彩色闪烁时的价格和数量数据。
我了解 1) 和 2) 将涵盖所有最高图书价格和数量。但是,就数据收集而言,我希望将 1) 和 2) 分开/区分。
收集的数据打算存储的时间段 -> 2-3 小时。
我需要知道哪种语言才能完成上述操作? 我知道我也需要成为高级 Excel 用户。
长期目标 - 我打算使用上述信息做出全权日内交易决策。从长远来看,我将更多地参与创建算法或指标以帮助决策过程,其中将包括上述信息。
我明白,一个人需要知道编码才能参与上述活动。因此我开始学习C++。更重要的是获得编码的悬挂/感觉。我一直在网上搜索从哪里开始这项工作。但是,我对所有信息感到非常困惑和不知所措。因此,除了特定的数据导出查询之外,任何其他指南也会有所帮助。
截至目前我使用MT4交易。因此,我相信要做到以上几点——我需要的不仅仅是 MT4。
任何帮助将不胜感激。
spring - 获取环形缓冲区中的当前消息数
我在我的 Web 应用程序中使用 Spring 的反应器模式。在内部,它使用LMAX 的 RingBuffer实现作为它的消息队列之一。我想知道是否有任何方法可以动态找出当前的 RingBuffer 占用情况。这将帮助我确定所需的生产者和消费者的数量(以及它们的相对比率),以及作为消息队列的 RingBuffer 是否得到最佳使用。我尝试了reactor.event.dispatch.Abs tractSingleThreadDispatcher类的getBacklog(),但它似乎总是给出相同的值:我在实例化反应器时使用的 RingBuffer 的大小。
任何有关该问题的信息将不胜感激。
java - (LMAX破坏者)如何自己获取数据而不是回调?
我了解到 LMAX 破坏者是一个高性能的线程间消息传递库。但是当我尝试使用它时,我发现事件处理程序使用回调方法来处理数据。
当发布者将事件发布到 RingBuffer 时调用
但是如果我不使用回调来获取数据,我会写一段时间(true)来自己获取数据,我该怎么办?
谢谢!
java - 如何找到 Lmax Disruptor 钻石(一个生产者 5 消费者 1 结论)示例?
我发现github上Lmax Disrupter的用户指南很简单,现在我有一个生产者和五个消费者的问题,之后我需要总结消费者的结果,有没有演示,如何找到Lmax Disruptor diamond (一个生产者5个消费者1个结论)例子?
非常感谢!
multithreading - 发生异常时,Disruptor 停放/停止多个 EventHandler
当我们的一个 EventHandler 发生故障时,我们遇到了 CPU 使用率过高的情况。
假设我们有几个消费者 ( EventHanlders
),它们被配置为在缓冲区上按顺序运行。如果第一个 EventHandler 抛出异常,是否有办法停止(并稍后唤醒它们)所有其他 EventHandler。
我们正在做的是让失败的线程进入睡眠状态,然后我们再次尝试使用相同的事件。但是我们注意到,RingBuffer
即使没有要读取的事件,其他线程也会继续运行并尝试读取,从而将 CPU 提高到可接受的水平。
目前我放弃这是因为WaitStrategy
,disruptor
因为在正常条件下按预期工作。我们正在使用BlockingWaitStrategy
那里。
为了示例的更多解释
其中 INPUT 是从 轮询的事件RingBuffer
,A、B、C 和 D 是按顺序执行的不同 EventHandler。A* 是引发异常的消费者。
我们想要实现的是,当消费者 A 无法消费事件时(例如,发生异常后),该消费者的 OnEvent(...) 方法不会退出,而是会停留在循环中,并定期休眠尝试再次消费唤醒时的相同事件。与此同时,所有其他消费者都应该停车或睡觉,直到 A 成功。
我们正在使用破坏者版本 3.3.0。
我一直在谷歌搜索,但还没有找到可行的解决方案。
提前致谢。
萨尔瓦。