我一直在玩AMQP的RabbitMQ客户端,我注意到ack
和reject
都只是一个传递标签。如果您ack
然后reject
使用相同的投放代码,会发生什么? RabbitMQ没有错误,但我想知道这是否应该抛出一个错误,说交付标签已被“声明”。
AMQP规范对此有什么要说的吗?
答案 0 :(得分:4)
简短回答
basic.ack
,basic.nack
,basic.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一般不会关注设计糟糕的制作人和消费者,而且仍然可以工作。