确认拒绝AMQP消息的逻辑是什么?

时间:2013-06-24 02:40:51

标签: rabbitmq amqp

我一直在玩AMQP的RabbitMQ客户端,我注意到ackreject都只是一个传递标签。如果您ack然后reject使用相同的投放代码,会发生什么? RabbitMQ没有错误,但我想知道这是否应该抛出一个错误,说交付标签已被“声明”。

AMQP规范对此有什么要说的吗?

1 个答案:

答案 0 :(得分:4)

简短回答

basic.ackbasic.nackbasic.reject以及其他一些方法是幂等的,因此多次使用相同的参数调用它们只会产生一次效果。

答案很长

您可能已经看过RabbitMQ上的AMQP协议AMQP specification,但我会根据文档<{3}}强调{/ 3}}

  

确认一条或多条消息......确认可以是针对单个消息或一组消息,包括特定消息

同样可以在basic.ack

中找到
  

此方法确认通过Deliver或GetOk方法传递的一条或多条消息。客户可以要求确认单个消息或一组消息,包括特定消息。

因此,如果您发送basic.ack不存在的传递标记,则不会发生任何事情,而队列中没有此类消息标记为待处理的ack'ing / nack',则不会有任何结果。

spec, paragraph 1.8.3.13.以类似的方式工作,但仅限于特定的消息。

关于AMQP协议的重要时刻它是异步设计的,所以几乎所有东西都是竞争条件的主体。 RabbitMQ在设计为高性能和可靠系统时不会尖叫,而不是大声和沉重。

我可以建议你使用这个用例:例如,你在主线程中使用消息并将其传递给子线程,一个或多个,所以可能会发生一个孩子完成处理而另一个孩子稍后完成它。当然,这是设计糟糕的架构的一个例子,但RabbitMQ一般不会关注设计糟糕的制作人和消费者,而且仍然可以工作。