RabbitMQ-带元数据的基本拒绝

RabbitMQ-带元数据的基本拒绝,rabbitmq,amqp,Rabbitmq,Amqp,我有一个消费者拒绝这些消息,并且确切地知道这些消息被拒绝的原因。她希望在拒绝消息时向制作人提供“为什么”和“什么” 对于nack'ing消息,但同时发送回描述消息失败原因的元数据,什么是好的队列体系结构 (在更高的层面上,如果制作人没有对“nacked原因码”进行任何处理,我认为记录消费者的原因码就足以让人看到,因此这个问题变得毫无意义。不过,假设不是这样,这似乎是一个有趣的问题。)您可以使用如下所述的RPC模型: 通过这种方式,您可以将带有原因的消息发送回发布者 您也可以考虑扩展,但您不能更改

我有一个消费者拒绝这些消息,并且确切地知道这些消息被拒绝的原因。她希望在拒绝消息时向制作人提供“为什么”和“什么”

对于nack'ing消息,但同时发送回描述消息失败原因的元数据,什么是好的队列体系结构


(在更高的层面上,如果制作人没有对“nacked原因码”进行任何处理,我认为记录消费者的原因码就足以让人看到,因此这个问题变得毫无意义。不过,假设不是这样,这似乎是一个有趣的问题。)

您可以使用如下所述的RPC模型: 通过这种方式,您可以将带有原因的消息发送回发布者

您也可以考虑扩展,但您不能更改消息,因此您只会收到消息已被拒绝的通知

只需做一点工作,您就可以创建一个exchange,在其中重定向
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);  
Map myHeader=newhashmap();

myHeader(“原因”,“无法访问数据库”)// 我也陷入了类似的问题。我的解决方案是在发送时(使用属性)为每条消息分配唯一的ID,然后在拒绝时将错误(将其与分配的ID关联)保存到redis/memcached中(我还在redis中使用time expiration来避免存储过载)。在我的例子中,这是可能的,因为我很快处理了所有这些死掉的消息,所以错误不应该被保留很长时间

可能没有那么优雅,但我不想手动发布任何东西,更喜欢依赖原生兔子功能,并且我不需要对代码做太多更改