javascript - 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
实现有关,还是我错过了什么?