gpt4 book ai didi

concurrency - LMAX 的颠覆者模式如何运作?

转载 作者:行者123 更新时间:2023-12-03 04:10:16 24 4
gpt4 key购买 nike

我试图理解 disruptor pattern 。我观看了 InfoQ 视频并尝试阅读他们的论文。我知道涉及一个环形缓冲区,它被初始化为一个非常大的数组,以利用缓存局部性,消除新内存的分配。

听起来好像有一个或多个原子整数来跟踪位置。每个“事件”似乎都有一个唯一的 ID,并且通过查找其相对于环的大小的模数等来找到它在环中的位置。

不幸的是,我对它的工作原理没有直观的认识。我做过很多交易应用,研究过actor model ,查看了SEDA等。

在他们的演讲中,他们提到这种模式基本上就是路由器的工作方式;但是我也没有找到关于路由器如何工作的任何好的描述。

是否有一些好的指示可以提供更好的解释?

最佳答案

Google 代码项目执行 reference a technical paper关于环形缓冲区的实现,但是对于想要了解其工作原理的人来说,这有点枯燥、学术性和困难。然而,有一些博客文章已经开始以更易读的方式解释内部结构。有一个explanation of ring buffer这是颠覆者模式的核心,a description of the consumer barriers (与从干扰器读取相关的部分)和一些information on handling multiple producers可用。

对 Disruptor 最简单的描述是:它是一种以最有效的方式在线程之间发送消息的方法。它可以用作队列的替代品,但它也与 SEDA 和 Actor 共享许多功能。

与队列相比:

Disruptor 提供了将消息传递到另一个线程的能力,并在需要时唤醒它(类似于 BlockingQueue)。但是,存在 3 个明显的差异。

  1. Disruptor 的用户通过扩展 Entry 类并提供一个工厂来进行预分配来定义如何存储消息。这允许内存重用(复制),或者 Entry 可以包含对另一个对象的引用。
  2. 将消息放入 Disruptor 是一个两阶段的过程,首先在环形缓冲区中声明一个槽,为用户提供可以填充适当数据的条目。然后必须提交该条目,这种两阶段方法对于灵活使用上述内存是必要的。正是提交使消息对消费者线程可见。
  3. 消费者有责任跟踪已从环形缓冲区中消费的消息。将这一责任从环形缓冲区本身移开有助于减少写入争用量,因为每个线程都维护自己的计数器。

与 Actor 相比

Actor 模型比大多数其他编程模型更接近 Disruptor,特别是如果您使用提供的 BatchConsumer/BatchHandler 类。这些类隐藏了维护所使用的序列号的所有复杂性,并在重要事件发生时提供一组简单的回调。但是,存在一些细微的差异。

  1. Disruptor 使用 1 线程 - 1 消费者模型,其中 Actor 使用 N:M 模型,即您可以拥有任意数量的 Actor,并且它们将分布在固定数量的线程(通常每个核心 1 个)上。
  2. BatchHandler 接口(interface)提供了一个额外的(且非常重要的)回调onEndOfBatch()。这允许缓慢的消费者,例如那些执行 I/O 将事件一起批处理以提高吞吐量的人。可以在其他 Actor 框架中进行批处理,但是由于几乎所有其他框架在批处理结束时都不提供回调,因此您需要使用超时来确定批处理的结束,从而导致延迟很差。<

与 SEDA 相比

LMAX 构建了 Disruptor 模式来取代基于 SEDA 的方法。

  1. 与 SEDA 相比,它的主要改进是并行工作的能力。为此,Disruptor 支持将相同的消息(以相同的顺序)多播给多个消费者。这避免了管道中 fork 阶段的需要。
  2. 我们还允许消费者等待其他消费者的结果,而无需在他们之间放置另一个排队阶段。消费者可以简单地查看它所依赖的消费者的序列号。这避免了管道中连接阶段的需要。

与内存屏障相比

另一种思考方式是将其视为结构化、有序的内存屏障。其中生产者屏障形成写屏障,消费者屏障形成读屏障。

关于concurrency - LMAX 的颠覆者模式如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com