RabbitMQ - 基本拒绝元数据

时间:2015-05-15 23:50:47

标签: rabbitmq amqp

我有一个拒绝邮件的消费者,并确切知道这些邮件被拒绝的原因。在拒绝信息时,她想向制作人提供“为什么”以及“什么”。

什么是nack'ing消息的良好队列架构,还发送回描述消息失败原因的元数据?

(在更高的层面上,如果生产者没有对'nacked reason codes做任何事情,我想从消费者那里记录原因代码就足以提高可见度,所以这个问题变得没有实际意义了。另外一个有趣的问题。)

2 个答案:

答案 0 :(得分:1)

您可以使用此处描述的RPC模型: https://www.rabbitmq.com/tutorials/tutorial-six-java.html 通过这种方式,您可以向发布者发回包含原因的消息。

您也可以考虑Dead Letter Exchanges分机,但无法更改消息,因此您只是被告知您的消息已被拒绝。

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

 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);  

通过这种方式,您可以维护原始邮件并仅修改标题。 (类似于死信消息)

希望有所帮助

答案 1 :(得分:0)

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

可能不那么优雅,但我不想手动发布任何内容,并且首选依赖本机兔功能,而且我没有对代码进行过多次更改。