RabbitMQ - 基本拒绝元数据

RabbitMQ - basic reject with metadata

我有一个拒绝消息的消费者,并且确切地知道这些消息被拒绝的原因。她想在拒绝消息时向生产者提供 "why" 和 "what"。

什么是既能发送消息又能发回描述消息失败原因的元数据的良好队列架构?

(在更高的层次上,如果生产者没有对“nacked 原因代码”做任何事情,我认为记录来自消费者的原因代码就足以提高可见性,所以这个问题变得没有实际意义。不过,假设不是这样,这似乎是一个有趣的问题。)

您可以按照此处所述使用 RPC 模型: https://www.rabbitmq.com/tutorials/tutorial-six-java.html 通过这种方式,您可以 send-back 向发布者发送消息并说明原因。

您也可以考虑 Dead Letter Exchanges 分机,但是您不能更改消息,所以您只是被告知您的消息已被拒绝。

通过一些工作,您可以创建一个交换,您可以在其中重定向 nack 消息,并使用 header 属性 消息来写原因,如下所示:

 Map<String, Object> myHeader = new HashMap<String, Object>();
 myHeader("reason", "can't access to database");//<-- just an example
 AMQP.BasicProperties.Builder bob = new AMQP.BasicProperties.Builder();
 bob.headers(myHeader);  

通过这种方式,您可以保持原始消息并仅修改header。 (类似于死信消息)

希望对您有所帮助

我遇到了类似的问题。我的解决方案是在发送时(使用属性)为每条消息分配唯一 ID,然后在拒绝时将错误保存(将其与分配的 ID 相关联)到 redis / memcached(我还在 redis 中使用时间过期来避免超载存储)。在我的情况下是可能的,因为我很快处理了所有这些死消息,所以错误不应该保留很长时间。

可能不那么优雅,但我不想手动发布任何内容,更喜欢依赖本机 rabbit 功能,而且我不需要对代码进行太多更改。