我试图理解破坏者模式。我看过 InfoQ 的视频并尝试阅读他们的论文。我知道涉及到一个环形缓冲区,它被初始化为一个非常大的数组以利用缓存局部性,消除新内存的分配。
听起来好像有一个或多个原子整数可以跟踪位置。每个“事件”似乎都有一个唯一的 id,它在环中的位置是通过找到它相对于环的大小等的模数来找到的。
不幸的是,我对它的工作原理没有直观的感觉。我做过很多交易应用,研究过actor模型,研究过SEDA等。
在他们的演讲中,他们提到这种模式基本上就是路由器的工作方式。但是我也没有找到关于路由器如何工作的任何好的描述。
是否有一些好的指示可以更好地解释?
Google Code 项目确实参考了有关实现环形缓冲区的技术论文,但是对于想要了解它如何工作的人来说,它有点枯燥、学术和艰难。然而,有一些博客文章已经开始以更易读的方式解释内部结构。有对作为中断器模式核心的环形缓冲区的解释,对消费者障碍(与从中断器读取相关的部分)的描述以及有关处理可用的多个生产者的一些信息。
Disruptor 最简单的描述是:它是一种在线程之间以最有效的方式发送消息的方式。它可以用作队列的替代方案,但它也与 SEDA 和 Actors 共享许多功能。
与队列相比:
Disruptor 提供了将消息传递到另一个线程的能力,如果需要,可以将其唤醒(类似于 BlockingQueue)。但是,有 3 个明显的区别。
与演员相比
与大多数其他编程模型相比,Actor 模型更接近 Disruptor,尤其是当您使用提供的 BatchConsumer/BatchHandler 类时。这些类隐藏了维护使用的序列号的所有复杂性,并在发生重要事件时提供一组简单的回调。但是,有一些细微的差别。
onEndOfBatch()
与 SEDA 相比
LMAX 构建了 Disruptor 模式来替代基于 SEDA 的方法。
与内存屏障相比
另一种思考方式是将其视为结构化的、有序的内存屏障。生产者屏障形成写屏障,消费者屏障是读屏障。