当前位置: 首页 > 知识库问答 >
问题:

消费者如何将帖子发回同一个Disruptor环形缓冲区

钱承允
2023-03-14

在多生产者设置中,有一个生产者线程和一个消费者线程。消费者可以将新事件发布回同一个环形缓冲区吗?我假设它在缓冲区已满时中断,并且消费者线程在处理当前事件时永远不会获得空闲插槽。换句话说,死锁会发生。

最好的方法是什么?我是否必须引入一种代理线程,它接收来自消费者的事件,并像普通生产者一样将它们发布到环形缓冲区?

补充-为什么有用?假设消费者线程正在处理股市数据事件,它需要向市场模拟器(一个类)发送订单,理想情况下,市场模拟器应该向相同的环形缓冲区发送订单执行事件。

共有2个答案

廖招
2023-03-14

如果您使用单生产者设置,则否,消费者无法回发到环形缓冲区,因为它不是单生产者

退一步讲,为什么只有一个消费者需要写入环形缓冲区?它已经知道它做了什么,其他任何东西都不会从缓冲区中读取。

如果有多个使用者,则可以写回缓冲区,但请确保将其他使用者选通到正在写回缓冲区的使用者,而不是生产者序列。

宋建本
2023-03-14

根据问题的其他细节提供单独的答案(我仍然相信我最初的答案是有效的)。

根据我的想法/经验,您试图一次完成很多工作,因为您将环形缓冲区的消费者和发布者混为一谈,这通常是两个独立的问题。我通常希望来自模拟器的响应事件以与原始事件处理相同的方式传递到环形缓冲区。

话虽如此,你所要求的实际上是可能的。

但是,您确实需要自己做更多的工作,并编写一个自定义EventProcessor,它允许您在尝试发布回事件之前将传入消息标记为已处理(从而释放插槽)。

 类似资料:
  • 由于消息需求的排序,我们有一个主题和一个分区。我们有两个消费者运行在不同的服务器上,具有相同的配置集,即groupId、consumerId和consumerGroup。即 1主题- 当我们部署消费者时,相同的代码会部署在两台服务器上。当消息到来时,我们会注意到两个消费者都在消费消息,而不是只有一个处理。让消费者在两台独立的服务器上运行的原因是,如果一台服务器崩溃,至少其他服务器可以继续处理消息。

  • 环形缓冲区接口 结构体 struct   rt_ringbuffer   环形缓冲区控制块 更多...   枚举 函数 void  rt_ringbuffer_init (struct rt_ringbuffer *rb, rt_uint8_t *pool, rt_int16_t size)   初始化环形缓冲区   void  rt_ringbuffer_reset (struct rt_rin

  • 关于破坏者,我有以下问题: 消费者(事件处理器)没有实现他们实现EventHandler的任何可调用或可运行接口,那么他们如何能够并行运行,因此,例如,我有一个disruptor实现,其中有这样一个菱形模式 其中c1到c3可以在p1之后并联工作,C4和C5在p1之后工作。 所以通常我会有这样的东西(P1和C1-C5是可运行/可调用的) 但是在Disruptor的情况下,我的事件处理程序都没有实现R

  • 问题内容: 我有一个JMS客户端,它正在生成消息并通过JMS队列发送到其唯一的使用者。 我想要的是不止一个消费者收到这些消息。我想到的第一件事是将队列转换为主题,以便现有用户和新用户都可以订阅并将相同的消息传递给他们。 显然,这将涉及在生产者和消费者方面修改当前的客户代码。 我还要查看其他选项,例如创建第二个队列,这样就不必修改现有的使用者。我相信这种方法有很多优点,例如(如果我错了,请纠正我)在

  • 我运行生产者,它生成N条消息,我在仪表板上看到它们。当我运行接收器时,它会接收来自队列的所有消息,并且队列为空。 我需要有多个生产者生成消息到同一个队列。多个客户从队列中接收消息。消息将被队列TTL删除。但是现在第一个接收者从队列中获取所有消息。我怎么能做到这一点?

  • 环形块状缓冲区接口 结构体 struct   rt_rbb_blk   rbb 中的块 更多...   struct   rt_rbb_blk_queue   块队列。这些块在队列中,其 buffer 地址是连续的 更多...   struct   rt_rbb   环形块状缓冲区,简称 rbb 更多...   枚举 函数 void  rt_rbb_init (rt_rbb_t rbb, rt_u