rabbitmq:消费者能否在nack之前保持消息更改?

rabbitmq:消费者能否在nack之前保持消息更改?,rabbitmq,rabbitmq-exchange,Rabbitmq,Rabbitmq Exchange,在消费者发送消息之前,消费者是否有任何方式可以修改消息的状态,以便消费者在重新交付时使用消息时,可以看到已更改的状态我不希望拒绝并重新排队新邮件,但请告诉我这是否是实现此目的的唯一方法。 我的目标是确定特定消息被重新传递的次数。我认为有两种方法可以做到这一点: (1) 如上所述,在消息本身上。该消息将是基本统计数据和应用程序负载消息的容器 (2) 在一些外部存储器中。我们将通过设置的消息id唯一地标识消息 我知道2是可能的,但我的问题是1是否可能。没有办法像你想的那样做(1)。您需要更改消息,因

在消费者发送消息之前,消费者是否有任何方式可以修改消息的状态,以便消费者在重新交付时使用消息时,可以看到已更改的状态我不希望拒绝并重新排队新邮件,但请告诉我这是否是实现此目的的唯一方法。

我的目标是确定特定消息被重新传递的次数。我认为有两种方法可以做到这一点:

(1) 如上所述,在消息本身上。该消息将是基本统计数据和应用程序负载消息的容器

(2) 在一些外部存储器中。我们将通过设置的消息id唯一地标识消息

我知道2是可能的,但我的问题是1是否可能。

没有办法像你想的那样做(1)。您需要更改消息,因此该消息将成为另一条消息。如果你想做类似的事情(你可能是说
我不想拒绝+重新排队新消息
)-你应该确认消息,增加消息中的一个字段,然后再次发布它(同样,也许这就是你说的
重新排队
)。因此,您的消息负载将具有一些ID、计数器,以及作为内容的负载(显然不同)

显然,更好的方法是(2)出于多种原因:

  • 它不会干扰业务逻辑,即此诊断部分是隔离的
  • 您将把重新排队留给rabbitmq(正如您应该做的那样),这意味着您不必担心丢失消息和处理一些对您的业务逻辑没有用处的消息元信息
  • 实际上,它应该被使用——ACKing和NACKing,这就是为什么它出现在AMQP规范中
  • 由于您确实需要特定消息重新传递的次数,因此您可以将其放在外部某处,这意味着它独立于(rabbitmq的)消息持久性、生存期、潜在的队列持久性镜像等

当您说修改消息的状态时,是否意味着它只是消息本身的另一个标志?比如在执行Nack之前修改消息内容?它必须是一个整数。我想你指的是一个BooleanNah只是想确保在我们做Nack之前它的信息得到更新。。因为在执行Nack之前,您确实可以控制消息,但不确定一旦更新消息,它是同一消息还是新消息。。原因如果id发生变化,则很难跟踪消息。