【问题标题】:RabbitMQ resend message to failed consumer onlyRabbitMQ 仅向失败的消费者重新发送消息
【发布时间】:2016-09-24 05:42:39
【问题描述】:

如果我将消息发布到交换器并且消息的使用者无法处理它,我可以按设定的时间间隔重试消息。问题是消息会发送给所有消费者,而不仅仅是失败的消费者。

如何只将消息重新发送给失败的消费者?

【问题讨论】:

  • 当您说向 Exchange 发送消息时,它是什么类型的交换?您是否每个消费者都有一个队列,并且消息会发布给所有消费者?能详细问一下吗?
  • 本次交流为话题交流。每个消费者都有自己的队列。

标签: rabbitmq message-queue


【解决方案1】:

如果消费者失败,则消息将留在队列中,您不必再次发送。当消费者启动并运行时,您将收到它未能处理的最后一条消息。这样我们就解决了一遍又一遍地发送消息的问题。而且您不必发送Nack 只是不要Ack 消息,当消费者失败时消息将在队列中。您可以通过在执行Ack 之前获取消息并停止消费者来尝试。您将能够在队列中再次看到该消息。

【讨论】:

    【解决方案2】:

    假设你有和交换绑定到更多队列

    exchange ---> queue1 ---> consumer 1 
            |---> queue2 ---> consumer 2
            |---> queue3 ---> consumer 3 
    

    如果一个消费者失败了,你不需要重新发送消息,消息被存储到队列中。这就是队列的范围

    【讨论】:

    • 如果消费者 2 失败,我只想在 5 分钟内将消息重新发送给消费者 2。你会怎么做?
    • 我相信如果消费者失败,你不必重新发送消息,不要确认消息。在消费者完全完成处理后,只需确认消息,它将被删除。使用 Rabbitmq,您可以在消费者端而不是在发布者端处理这个问题。如果消费者处理消息失败,它会留在队列中,当消息启动时消费者会再次获取消息。
    • @tibanez 您不必重新发送消息。正如 Mitra Ghorpade 所说,使用手动 ack 就足够了。如果消费者失败,则不发送 ack。我想补充一点,你总是发布到一个交易所,你总是消费到一个或多个队列。
    • @MitraGhorpade 我知道我可以发送nack 并告诉它重新排队消息,但这只会一遍又一遍地发送消息。我想每 5 分钟重新发送一次消息。
    • 我认为如果说你的消费者失败了,那么消息将留在队列中,你不必再次发送它。当消费者启动并运行时,您将收到它未能处理的最后一条消息。这样我们就解决了一遍又一遍地发送消息的问题。而且您不必发送 Nack 只是不确认消息,当消费者失败时,消息将在队列中。您可以通过在执行 Ack 之前获取消息并停止消费者来尝试。您将能够在队列中再次看到该消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多