如何将中断器与多种消息类型结合使用
我的系统有两种不同类型的消息 - 类型 A 和 B。每条消息都有不同的结构 - 类型 A 包含一个 int 成员,类型 B 包含一个双精度成员。我的系统需要将这两种类型的消息传递到多个业务逻辑线程。减少延迟非常重要,因此我正在研究使用 Disruptor 以机械交感的方式将消息从主线程传递到业务逻辑线程。
我的问题是,干扰器只接受环形缓冲区中的一种类型的对象。这是有道理的,因为干扰器预先分配了环形缓冲区中的对象。但是,这也使得通过 Disruptor 将两种不同类型的消息传递到我的业务逻辑线程变得很困难。据我所知,我有四个选择:
将干扰器配置为使用包含固定大小字节数组的对象(如应如何使用 Disruptor(Disruptor 模式)构建真实消息系统?在这种情况下,主线程必须在将消息发布到中断器之前将消息编码为字节数组,并且每个业务逻辑线程必须在收到时将字节数组解码回对象。此设置的缺点是业务逻辑线程没有真正共享来自干扰器的内存 - 相反,它们从干扰器提供的字节数组创建新对象(从而创建垃圾)。此设置的好处是,所有业务逻辑线程都可以从同一中断器读取多个不同类型的消息。
将干扰器配置为使用单一类型的对象,但创建多个干扰器,每个对象类型一个。在上面的例子中,将有两个单独的干扰器 - 一个用于A类型的对象,另一个用于B类型的对象。此设置的好处是,主线程不必将对象编码为字节数组,并且业务较少的逻辑线程可以共享与中断器中使用的对象相同的对象(不创建垃圾)。此设置的缺点是,每个业务逻辑线程都必须以某种方式订阅来自多个中断器的消息。
将干扰器配置为使用包含消息 A 和 B 的所有字段的单一类型的“超级”对象。这非常反对OO风格,但允许在选项#1和#2之间进行折衷。
将干扰器配置为使用对象引用。但是,在这种情况下,我失去了对象预分配和内存排序的性能优势。
对于这种情况,您有什么建议?我觉得选项#2是最干净的解决方案,但我不知道消费者是否可以或如何在技术上订阅来自多个破坏者的消息。如果有人能提供如何实现选项#2的示例,将不胜感激!