Javascript 是否仍要防止rabbitmq死信队列丢弃属性?

Javascript 是否仍要防止rabbitmq死信队列丢弃属性?,javascript,rabbitmq,Javascript,Rabbitmq,我在rabbitmq上使用死信交换功能来执行计划的rpc调用,但在队列死信后,它删除了原始队列中的replyto属性。是否仍然需要以将其保留在“死队列”中的方式声明replyto属性 顺便说一句,我是用node.js中的amqplib来实现这一点的。不幸的是,RabbitMQ将只保留下列属性: queue—消息在死信之前所在队列的名称 原因-使用DLX的原因 时间-消息的日期和时间以64位AMQP格式时间戳的形式显示 exchange—邮件发布到的exchange 路由密钥-发布邮件时使用的路

我在rabbitmq上使用死信交换功能来执行计划的rpc调用,但在队列死信后,它删除了原始队列中的replyto属性。是否仍然需要以将其保留在“死队列”中的方式声明replyto属性


顺便说一句,我是用node.js中的amqplib来实现这一点的。

不幸的是,RabbitMQ将只保留下列属性:

  • queue—消息在死信之前所在队列的名称
  • 原因-使用DLX的原因
  • 时间-消息的日期和时间以64位AMQP格式时间戳的形式显示
  • exchange—邮件发布到的exchange
  • 路由密钥-发布邮件时使用的路由密钥
  • 计数-由于此原因,此消息在此队列中出现死信的次数,以及
  • 原始过期-消息的原始过期属性
我认为有两种方法可以解决你所看到的问题

1) 将回复放在您自己的标题或属性字段中,并从那里读取/在不在通常位置时替换它

2) 不要使用“答复”字段。取而代之的是,在以后的某个时间点使用一个众所周知的交换来获得回复

使用reply to字段通常意味着请求/响应或RPC场景。这些场景通常需要快速响应。如果响应不快,系统通常可以在没有响应的情况下向前移动,即使只是给用户一条消息,说“X现在不可用”

您说您正在使用DLX执行计划的RPC调用。。。延迟消息是DLX的一个常见用例-这没什么错。但是延迟RPC响应可能会遇到一些重大挑战,这些挑战超出了您已经看到的范围

例如,当您的系统出现故障,并且发出原始请求的代码不再用于侦听响应时,会发生什么情况?这个问题的答案取决于您是否真的需要处理响应。如果您确实需要处理它-如果不需要,系统将遇到严重的问题-那么RPC可能是危险的

与其依赖RPC并暗示对给定响应的暂时需求,不如通过单独的队列使用双向消息传递。我在我的帖子和电子邮件课程/电子书中都写过这方面的内容

其要点是,您可以通过让原始消息发布者也成为具有响应队列的订阅者,从而避免需要回复队列

长时间运行的流程post中的一个示例:


var DrinkRequestSender = new Sender(/* ... details ... */);
var DrinkRequestReceiver = new Receiver(/* ... details ... */);

var DrinkStation = {
  make: function(drink){

    DrinkRequestReceiver.receive((response) => {
      var drinkResponse = response.body;
      this.trigger("drinkup", drinkResponse);
    });

    var drinkData = drink.toJSON();
    DrinkRequestSender.send(drinkData);
  }
};
在本例中,代码发送“请求”,然后接收“响应”——但不使用标准RPC设置。它使用专用队列进行响应,另一端的代码通过路由到该队列的交换机将响应发送回

这使您能够更好地处理故障场景、长时间运行的流程等

不过,这种双向消息传递方式确实增加了一些额外的挑战。首先,您必须具备重建发出原始请求的对象的能力

您可以在中找到此详细信息,中还有更多信息(以及许多其他模式)


希望有帮助

谢谢你的回答,德里克!我将试试你的建议:)