Node.js 队列路由到默认exchange,即使设置了DLX参数

Node.js 队列路由到默认exchange,即使设置了DLX参数,node.js,rabbitmq,node-amqp,Node.js,Rabbitmq,Node Amqp,这里真的很困惑 设置死信道具排队 var amqp = require('amqp'), conn = amqp.createConnection(); var key = "batch.delay." + (new Date().getTime()).toString(); var options = { arguments: { "x-dead-letter-exchange": "immediate", "x-message-ttl": 30000,

这里真的很困惑

设置死信道具排队

var amqp = require('amqp'),
    conn = amqp.createConnection();

var key = "batch.delay." + (new Date().getTime()).toString();
var options = {
  arguments: {
    "x-dead-letter-exchange": "immediate",
    "x-message-ttl": 30000,
    "x-expires": 40000,
    "x-dead-letter-routing-key": 'hit.api'
  }
};

conn.queue(key, options);
定义实际的交换

conn.exchange('immediate', {
  durable: true,
  autoDelete: false,
  type: 'direct'
}, function (exchange) {
  // other thing...
});
问题是,所有流量都通过默认的交换,而不是死信交换。ttl道具将得到尊重,但不是exchange名称。从这里可以看到

想法

编辑:

在下面,您可以看到创建的队列,这些队列在到期后将进入DLX


上面的示例设置了一个带有路由密钥的DLX,这很好,但是您需要指定一个接受该路由密钥的死信队列

如果您不需要路由密钥,我建议使用扇出交换。我在这里发布了如何做到这一点的答案:


问题在于,您试图按每条消息设置x死信交换。DLX是在整个队列上设置的。您可以看到您的队列上没有DLX,如果有,它将有一个DLX图标,如下图所示

然后将x-dead-letter-routing-key添加到各个消息中


x-expire也是队列级别设置,而不是消息级别设置。

好的,所以。。是这样的:

  • 是否创建过期到DLX的队列?检查
  • 创建DLX?检查
  • 是否将数据推送到过期的队列?没有
这是一个范围问题。。。我以为我在循环将要发布到即将过期的队列的数据,但数据始终是一个空数组,因此从未发布任何内容

一旦我弄明白了这一点,队列将充满数据,过期到DLX,绑定到DLX的队列将接收数据


非常感谢@jhilden和我一起畅所欲言

解释中没有包括这一点,因为我已将队列绑定到DLX,如果我在DLX中(通过管理界面)放置带有路由密钥的消息,则正确的队列会将其拾取。问题是,当批处理.delay队列过期时,它们将在默认exchange中被丢弃,而不是在
x-dead-letter-exchange
参数中指定的exchange中被丢弃。我觉得我错过了一张图片,我是否误解了DLX应该如何工作?@RoyKolak,检查我的新答案,我对根本问题有点误解。我可以验证我的
批处理。延迟
队列是否有DLX、TTL等。。。管理控制台中的道具。但我注意到,在它的短暂寿命内,没有任何数据发布到它。我认为这可能是真正的问题,因为当
batch.delay
过期时,没有流量被驱动到DLX是有意义的。我以前从未使用过batch.delay,我在rabbit文档中没有看到它。你有链接吗?batch.delay正是我命名的队列,它应该进入死信交换。我已经更新了我的问题,添加了这些队列的快照。