首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Disruptor 全解析(2):如何从 Ring Buffer 读取

2012-08-09 
Disruptor 全解析(2):怎么从 Ring Buffer 读取?原文地址:http://mechanitis.blogspot.com/2011/06/dissect

Disruptor 全解析(2):怎么从 Ring Buffer 读取?
原文地址:http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-how-do-i-read-from.html?? ?作者是 Trisha Gee, LMAX 公司的一位美女工程师:)

这是理解?LMAX? 开发的?Disruptor 模式? 文章系列的下一篇。


从?上一篇文章? 我们都明白了什么是 Ring Buffer 以及?它有多棒。遗憾的是,我还没有提到当你使用 Disruptor 时,怎样实际的写入或读取。

ConsumerBarrier 和消费者
我要稍微倒过来介绍它,因为总的来说这块比较容易理解。假设一些魔术已经把 Ring Buffer 填充好了,怎样从 Ring Buffer 读出这些东西?


Disruptor 全解析(2):如何从 Ring Buffer 读取
(好的,我开始后悔使用 Paint/Gimp??了。尽管它是个购买画图板的好借口,如果我继续写下去的话。UML 权威们大概也在诅咒我的名字了。)
Consumer 是一个想要从 buffer 里拿出东西的线程,它可以访问 ConsumerBarrier 对象——这个对象由 RingBuffer 创建并且代表 Consumer 与它交互。就像 Ring Buffer 显然需要用序号找到下一个可用节点一样,消费者同样需要知道序号——每个消费者都需要能找到下一个想访问的序号。在上面的例子中,消费者已经处理了 Ring Buffer 里序号 8 与之前的所有东西,那么它期待的下一个序号是 9。
消费者调用?ConsumerBarrier 对象的 waitFor 方法传递它需要的下一个序号。


拿到了数据后,消费者会更新自己的游标 (cursor)。
你应该已经开始感觉得到,这样是怎样有助于平复延迟尖峰了——代替一个一个节点的询问“我能拿到下一个吗?现在怎么样?现在呢?”,消费者 Consumer 只需要简单的说“当你拿到的数字比这个大的时候请告诉我”,返回值会告诉它有多少个新的节点可以抓取。因为这些新的节点确实已经写入(Ring Buffer 的序号已经更新过了),并且因为对这些节点唯一尝试做的操作是读而不是写,所以这些操作不用加锁。这太好了,不仅写代码可以更加安全和简单,而且不加锁的速度超快。
额外的好处是——你可以用多个 Consumer 读取同一个 RingBuffer, ?不需要锁,也不需要额外的队列来协调不同的线程。这样你可以在 Disruptor 协调下实现真正的并发处理。
BatchConsumer? 是一个消费者的示例代码。如果你实现了?BatchHandler?, ?你可以用 BatchConsumer 来完成我上面提到的繁重工作。它很容易操作成批需要处理的节点(例如上文 9-12 的节点)而不用单独获取每一个节点。

修改:注意 Disruptor 2.0 版使用了与这篇文章不一样的命名。如果你对类名感到困惑,请阅读我的?变更总结?。
本文翻译自原作者博客, 译者是博客园?﹎〾敏ō?(http://www.cnblogs.com/adaikiss/??????), 我只是转载并修改了若干字句, 特别感谢。 ?

?

热点排行