首页 > 解决方案 > noAck 参数在 NestJS RabbitMQ 微服务中不起作用

问题描述

我正在使用ServerRMQ策略在 NestJS 应用程序中构建微服务。我noAck在服务器选项中将字段设置为 false:

const app = await NestFactory.createMicroservice(ApplicationModule, {
  strategy: new ServerRMQ({
    urls: [RABBITMQ_URI],
    queue: EXAMPLE_QUEUE_NAME,
    noAck: false,
    queueOptions: {durable: false},
  }),
});

await app.listenAsync();

当事件处理期间发生错误时,我正在调用channel.nack方法将not acknowledge消息发送到 RMQ。之后,RMQ 应该重新发送消息:

@EventPattern(ExampleMessagePattern.EVENT)
  handleExampleEvent(
    @Payload() {meta, payload}: IExampleEventData,
    @Ctx() context: RmqContext,
  ) {
    try{
      ...    // Performing some actions
    } catch(err) {
      const message = context.getMesssage();
      const channel = context.getChannelRef();
      channel.nack(message, false, true);
      // or: context.args[1].nack(context.args[0], false, true);
    }
  }

ER:应用程序创建一个Acknowledgement required启用了功能的消费者,并且nack可以在channel对象上成功调用方法以在发生错误时执行重试机制。

AR:创建消费者时没有确认功能;channel.nack方法调用导致 RMQ 端出错,服务与 RMQ 服务器断开连接。

来自 RabbitMQ 标准输出的错误:

错误:服务器关闭通道:406(PRECONDITION-FAILED),消息为“PRECONDITION_FAILED - 未知传递标签 1

我假设noAck字段不启用acknowledgement功能。为了检查这一点,我使用pika库运行了一个 python 脚本并创建了一个auto_ack字段设置为 false 的使用者:

#!/usr/bin/env python
import pika

credentials = pika.PlainCredentials('rabbit', 'rabbit')
connection = pika.BlockingConnection(
    pika.ConnectionParameters(host='localhost', credentials=credentials))
channel = connection.channel()

channel.queue_declare(queue='example')


def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)


channel.basic_consume(
    queue='example', on_message_callback=callback, auto_ack=False)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming() 

此脚本创建了一个ack启用了功能的使用者:

在此处输入图像描述

在屏幕截图中,您可以看到消费者列表RabbitMQ Management UI。第一个是 python 脚本使用者,已Ack required设置为 true。第二个是noAck设置为 false 的 NestJS ServerRMQ 消费者(但ack功能未启用)。当我尝试设置noAck为 true(这是 中的默认行为ServerRMQ)时,我得到了相同的结果。

有没有人遇到过这种问题?它与 NestJSServerRMQ实现有关,还是我错过了什么?

标签: javascriptnode.jsrabbitmqnestjsconsumer

解决方案


推荐阅读