LMAX Disruptor - 维护事件的顺序

Posted

技术标签:

【中文标题】LMAX Disruptor - 维护事件的顺序【英文标题】:LMAX Disruptor - Maintain order of events 【发布时间】:2018-09-02 04:16:55 【问题描述】:

我有一个从各种文件加载时间序列数据的应用程序。应用程序为每个文件打开一个线程以并行加载数据。文件中的记录是有序的,但我需要向应用程序的其余部分提供一个提要,以保持整体事件的顺序。

这是否可以使用破坏者来实现,例如多个生产者一种消费者类型的设计来维护事件的顺序?

我目前正在使用阻塞集合和排序列表对每个阻塞集合的头部进行排序,但这会消耗大量内存,我很想看看其他人是否使用不同的架构实现了类似的设计。

谢谢

【问题讨论】:

【参考方案1】:

如果您重新设计为对象流之类的东西(专注于流),那么从文件加载应该只加载内存中的最小值(您需要的缓冲区大小。)每个流预取 1 个头项。

然后你必须实现一个 k-way 合并来选择 N 个项目中最低的一个。您可以将流放在二叉树中。当弹出最小值时,流在树中重新定位(交换和旋转)。当然,弹出一个值大约是 O(log n)。当溪流干涸时,从树上移走。

它是 2 排序数组合并的概括;您必须按头来处理数组,这与对随机集进行排序完全不同;你有一个几乎有序的集合,除了 1 个流不合适。您可以进行二进制搜索,但在内存副本中重新插入会很昂贵。树的旋转更简单。

(破坏者与此无关......哈哈)

【讨论】:

以上是关于LMAX Disruptor - 维护事件的顺序的主要内容,如果未能解决你的问题,请参考以下文章

从 LinkedBlockingQueue 迁移到 LMAX 的 Disruptor

disruptor框架

并发框架Disruptor译文

Disruptor并发框架

并发框架Disruptor译文

LMAX Disruptor 最简单实际的示例代码