【问题标题】:How does the broker make sure that message is consumed only by one consumer?代理如何确保消息只被一个消费者消费?
【发布时间】:2021-05-01 12:14:19
【问题描述】:

我有一个队列,有两个消费者 c1 和 c2。我的两个消费者正在运行。当消息发布到队列时,JMS 代理(RabbitMQ)如何确保该消息仅被一个消费者消费?

【问题讨论】:

  • 这个问题的答案完全取决于RabbitMQ是如何实现的。因此,我删除了一般的jmsmessage-queue 标签。

标签: rabbitmq


【解决方案1】:

现有的消息系统(RabbitMQ/Kafka/Kinesis/SQS)不能保证消息的消费,但可以保证消息的传递。

但是,单个消费者的消息消费可以在消费者代码中完成,并向 RabbitMQ 肯定消息是由消费者处理的。如果在处理过程中出现验证错误/外部 API 调用错误或消费者退出时出现未知错误,RabbitMQ 会重新传递带有重新传递标志的消息,在这种情况下,消费者代码应针对分布式缓存/数据库检查早期的消息处理,然后采取进一步行动。这样可以保证消息消费一次。所有的消息系统都会在不同的情况下重新传递消息,因此建议对重复处理进行编码。

在您的情况下的单个活动消费者场景中,RabbitMQ 将消息重新传递给当前活动的消费者,尽管您可能有多个处于待机模式的消费者实例正在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多