Disruptor 全解析(2):怎么从 Ring Buffer 读取?
原文地址:http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html?? ?作者是 Trisha Gee, LMAX 公司的一位美女工程师:)
这是理解?LMAX? 开发的?Disruptor 模式? 文章系列的下一篇。
ConsumerBarrier 和消费者
我要稍微倒过来介绍它,因为总的来说这块比较容易理解。假设一些魔术已经把 Ring Buffer 填充好了,怎样从 Ring Buffer 读出这些东西?
拿到了数据后,消费者会更新自己的游标 (cursor)。
你应该已经开始感觉得到,这样是怎样有助于平复延迟尖峰了——代替一个一个节点的询问“我能拿到下一个吗?现在怎么样?现在呢?”,消费者 Consumer 只需要简单的说“当你拿到的数字比这个大的时候请告诉我”,返回值会告诉它有多少个新的节点可以抓取。因为这些新的节点确实已经写入(Ring Buffer 的序号已经更新过了),并且因为对这些节点唯一尝试做的操作是读而不是写,所以这些操作不用加锁。这太好了,不仅写代码可以更加安全和简单,而且不加锁的速度超快。
额外的好处是——你可以用多个 Consumer 读取同一个 RingBuffer, ?不需要锁,也不需要额外的队列来协调不同的线程。这样你可以在 Disruptor 协调下实现真正的并发处理。
BatchConsumer? 是一个消费者的示例代码。如果你实现了?BatchHandler?, ?你可以用 BatchConsumer 来完成我上面提到的繁重工作。它很容易操作成批需要处理的节点(例如上文 9-12 的节点)而不用单独获取每一个节点。
修改:注意 Disruptor 2.0 版使用了与这篇文章不一样的命名。如果你对类名感到困惑,请阅读我的?变更总结?。
本文翻译自原作者博客, 译者是博客园?﹎〾敏ō?(http://www.cnblogs.com/adaikiss/??????), 我只是转载并修改了若干字句, 特别感谢。 ??