当RingBuffer预先分配给定类型的对象时,如何使用单个环形缓冲区来处理各种不同类型的消息?
您不能创建要插入到ringBuffer中的新对象实例,这将违背预先分配的目的。
因此,在异步消息传递模式中可以有3条消息:
那么,我的问题是,您是如何将Disruptor模式用于现实世界的信息系统的呢?
谢谢
链接:http://code.google.com/p/disruptor-net/wiki/CodeExamples
http://code.google.com/p/disruptor-net
http://code.google.com/p/disruptor
发布于 2011-08-04 09:40:53
一种方法(我们最常见的模式)是以封送形式存储消息,即作为字节数组。对于传入的请求,例如Fix消息,二进制消息被快速地从网络中拉出并放置在环形缓冲区中。不同类型消息的解组和分派由该环形缓冲区上的EventProcessors (使用者)处理。对于出站请求,消息被序列化为预先分配的字节数组,该数组形成了环形缓冲区中的条目。
如果您使用某些固定大小的字节数组作为预先分配的条目,则需要一些额外的逻辑来处理较大消息的溢出。也就是说,选择一个合理的默认大小,如果超出,则分配一个更大的临时数组。然后,当条目被重用或使用时(取决于您的用例)将其丢弃,然后返回到原来预先分配的字节数组。
如果您对不同的消息类型有不同的使用者,您可以通过知道带有类型信息的字节数组中的偏移量,或者通过在条目上传递鉴别器值,快速确定使用者是否对特定的消息感兴趣。
此外,没有禁止创建对象实例和传递引用的规则(我们也在几个地方这样做)。您确实失去了对象预分配的好处,但是干扰器的设计目标之一是允许用户选择最合适的存储形式。
发布于 2012-04-04 19:49:25
有一个名为byte (http://javolution.org/)的库,让我们将对象定义为具有固定长度字段(如string40等)的结构,这些字段依赖于内部的字节缓冲区,而不是可变大小的对象.这允许使用固定大小的对象初始化令牌环,从而(希望是)连续的内存块,从而使缓存更有效地工作。
我们使用它传递事件/消息,并在业务逻辑中使用标准字符串等。
发布于 2018-03-17 01:04:28
回到对象池。
以下是一个假设。
如果您将有3种类型的消息(A,B,C),您可以为这些预先分配的消息创建3个数组。这将创建3个内存区域A,B,C。
这并不是说只有一条缓存线,而是有很多,它们不一定是连续的。一些缓存行将指区域A、其他B和其他C中的某些内容。
因此,环缓冲区条目可以有一个对A&B& C的共同祖先或接口的引用。
问题是如何在池中选择实例;最简单的是具有与环形缓冲区长度相同的数组长度。这意味着大量浪费的池对象,因为在任何条目中,只使用其中的一个,例如:环形缓冲区条目1234可能使用消息B1234,但任何人都不使用A1234和C1234。
您还可以使用所有3个A+B+C实例内联并使用某些字节或枚举来指示类型。在内存大小上也同样浪费,但由于条目的肥胖,看起来更糟了。例如,只处理C消息的读取器具有较少的缓存局部性。
我希望我对这个假设没有太错。
https://stackoverflow.com/questions/6933347
复制相似问题