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

Nic*_*las 0 amqp rabbitmq

我一直在使用 AMQP 的 RabbitMQ 客户端,我注意到,ack两者reject都只接受交付标签。ack如果您使用reject相同的交货标签会发生什么?RabbitMQ 不会出错,但我想知道这是否会抛出一个错误,表明传递标签已被“声明”。

AMQP 规范对此有什么规定吗?

pin*_*ain 5

简短回答

\n\n

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

\n\n

长答案

\n\n

您可能已经看到了 RabbitMQ 上的 AMQP 协议的AMQP 规范,但我会basic.ack 根据文档强调这一点

\n\n
\n

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

\n
\n\n

同样可以在规范第 1.8.3.13 段中找到。

\n\n
\n

此方法确认通过 Deliver 或 Get\xc2\xadOk 方法传递的一条或多条消息。客户端可以要求确认一条消息或一组消息,最多包括一条特定消息。

\n
\n\n

因此,如果您basic.ack使用不存在的传递标签发送,则不会发生任何事情,而队列中没有标记为待确认/不确认的消息,则不会确认任何内容。

\n\n

basic.reject 的工作方式类似,但仅针对特定消息。

\n\n

AMQP 协议的一个重要时刻是它是异步设计的,因此几乎所有事情都受到竞争条件的影响。RabbitMQ 不会在所有事情上尖叫,但它被设计为高性能和可靠的系统,而不是大声和笨重。

\n\n

我可以建议您使用这种用例:例如,您在主线程中使用消息并将其传递给一个或多个子线程,因此可能会发生一个子线程完成处理而另一个子线程稍后完成的情况。当然,这是一个设计糟糕的架构的例子,但是 RabbitMQ 并不关心设计糟糕的生产者和消费者,一般来说,并且仍然可以工作。

\n