Jam*_*oat 28 disruptor-pattern
由于RingBuffer预先分配给定类型的对象,如何使用单个环形缓冲区来处理各种不同类型的消息?
您无法创建要插入ringBuffer的新对象实例,这会破坏预先分配的目的.
因此,您可以在异步消息传递模式中拥有3条消息:
所以我的问题是你是如何将Disruptor模式用于现实世界的消息系统?
谢谢
链接:http: //code.google.com/p/disruptor-net/wiki/CodeExamples
Mic*_*ker 32
一种方法(我们最常见的模式)是以消息形式存储消息,即作为字节数组.对于传入请求,例如修复消息,二进制消息,快速拉出网络并放入环形缓冲区.不同类型消息的解组和分派由该环形缓冲区上的EventProcessors(使用者)处理.对于出站请求,消息被序列化为预分配的字节数组,该数组在环形缓冲区中形成条目.
如果使用某个固定大小的字节数组作为预分配条目,则需要一些额外的逻辑来处理较大消息的溢出.即选择合理的默认大小,如果超过,则分配一个更大的临时数组.然后在重用或使用该条目时(根据您的使用情况)将其丢弃,并恢复为原始的预分配字节数组.
如果您针对不同的消息类型有不同的消费者,则可以通过了解带有类型信息的字节数组的偏移量或通过在条目上传递鉴别器值来快速确定您的消费者是否对特定消息感兴趣.
也没有反对创建对象实例和传递引用的规则(我们也在几个地方这样做).您确实失去了对象预分配的好处,但是破坏者的设计目标之一是允许用户选择最合适的存储形式.
有一个名为Javolution的库(http://javolution.org/)让你将对象定义为具有固定长度字段的结构,如字符串[40]等依赖于内部字节缓冲区而不是可变大小的对象......允许令牌环用固定大小的对象初始化,因此(希望)连续的内存块允许缓存更有效地工作.
我们使用它来传递事件/消息,并使用标准字符串等作为我们的业务逻辑.