【问题标题】:Rabbit mq detect there is no producer in consumers codeRabbit mq 检测消费者代码中没有生产者
【发布时间】:2018-12-09 13:26:50
【问题描述】:

我有一个带有生产者和许多消费者的 rabbitmq 设置。

告诉消费者生产者由于崩溃或其他故障而无法发送的最佳实践方法是什么?

如果生产者出现故障,我想通知并向所有消费者显示合适的消息。

【问题讨论】:

  • RabbitMQ 确实默认处理了“生产者不生产”的情况 - 与队列没有消息的情况相同。无论哪种情况,经纪人都非常乐意什么都不做。

标签: c# rabbitmq rabbitmq-exchange


【解决方案1】:

没有一种自动的方法可以做到这一点,但总的来说,消息系统旨在将生产者和消费者解耦。基本思想是消费者对生产者一无所知。

说,您应该处理生产者崩溃并可能采用publish confirm 的政策,您希望对生产者有更多控制权

【讨论】:

  • 是的,我看到文档在讨论 acks 机制,但不知道如何在我的案例中使用它们。生产者可能有一段时间不生产,但我必须在所有消费者中保持生产者的活跃状态。我应该为这种情况自己创建一个“活力机制”吗?创建一条以一定间隔发送的消息,并确保我得到了生产者的确认?
【解决方案2】:

我知道现在回答你的问题有点晚了,但这是我让消费者​​知道生产者还活着的方法:你可以在任务中添加一条 ping 消息,例如每 X 秒发布到 RabbitMQ。

此解决方案适用于从 RMQ 返回的 ACKS,并且当您有大量消息传入时它适用。这不会影响您使用 ACKS 的性能

以C#中的代码为例:

...
m_mainTimer = new System.Timers.Timer();
m_mainTimer.Interval = 10000;   // every 10 secs
m_mainTimer.Elapsed += m_mainTimer_Elapsed;
m_mainTimer.AutoReset = false;  // makes it fire only once
m_mainTimer.Start(); // Start
...
void m_mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e){
     try {
          // send to RMQ
          sendMessageToRabbitMQ("PING", "error");
          m_timerTaskSuccess = true;
     } catch (Exception ex) {
          m_timerTaskSuccess = false;
     } finally {
          if (m_timerTaskSuccess) {
                m_mainTimer.Start();
          }
     }
}

RMQ 中的实际消息:

{
  "Message": "PING",
  "Timestamp": 1620303014184
}

如果您在 11 秒内没有收到此消息,则说明存在问题。

我希望它也能帮助其他人。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多