[翻译]RabbitMQ中 immediate 和 mandatory 的用法
Contents
immediate 和 mandatory 字段是 AMQP 规范的一部分,并且还包含在 RabbitMQ FAQ 中指出实现者如何解释它们的含义的。
Mandatory
如果消息无法路由到队列,则此标志告诉服务器如何执行。具体来说,如果设置了 mandatory 并且运行绑定消息后(译注:即进行消息路由)放到0个队列中,则该消息返回给发送者(通过 basic.return )。如果在相同情况下但没有设置 mandatory ,则服务器会静默地删除该消息。
或者用我的话说:把这条消息放到至少一个队列上,如果你无法做到,那就将它返回给我。
immediate
对于发布一条带有 immediate 的消息,如果匹配的队列中已经准备好了消费者,则将消息路由到其中一个队列中。如果消费者刚在 ack 接收信息之前崩溃了,则该消息将被重新进队 和/或 分发到其他该队列上的消费者(如果没有崩溃,那么消息被确认,并且按照正常情况进行)。但是,如果匹配的队列中具有 0 个就绪消费者,那么该消息在随后的队列分发中不会重新进队。只有当所有匹配的队列中都没有就绪的消费者时才会将消息返回给发送者(通过 basic.return )
或者用我的话说:“如果至少有一个消费者连接到我的队列,并且该消费者现在就可以消费这条消息,则立即分发这条消息给它们。如果没有消费者连接到我的队列,那么我的消息延迟消费是毫无意义的,然后消费者就会一直看不到它。They snooze, they lose.”