如何在 Pubsub 上正确使用 nack?
Posted
技术标签:
【中文标题】如何在 Pubsub 上正确使用 nack?【英文标题】:How to use nack on Pubsub properly? 【发布时间】:2021-11-01 07:52:18 【问题描述】:我正在从 Pubsub 中的某个主题收集消息。主要思想是,对于我收到的每条消息都做一些逻辑(在数据库中插入一些东西)。 我的问题是这个。
完成逻辑后,我想添加一个message.ack()
方法来告诉 pubsub“好的,这条消息完成了!”。
我的问题是我想去“黑暗的一面”,如果有人失败,请在message.nack()
上告诉我“好吧 pubsub,我们有问题,我不承认这个消息,所以让我们继续剩下的"
但是它一直抛出这个错误并且不继续其他消息。
我能做什么?
控制器:
@EventPattern('topicName')
async extractMessageTopic(msg: Message)
try
console.log("--Iniciando--");
await this.appService.extractMessageTopic(msg)
msg.ack() //Acknoledge the message
catch (error)
console.log("Error primera capa!", error);
msg.nack()//If any error, dont acknoledge
服务:
async extractMessageTopic(msg: Message)
const buf = Buffer.from(msg.data)
const dataObject: any = JSON.parse(buf.toString())
console.log("Mensaje -> ", dataObject);
console.log("------------");
//Inserto En shipment
//const shipId = await this.shipmentRepositoryService.insert(dataObject)
//Inserto en Orders
//Inserto en Lines
谢谢!
【问题讨论】:
【参考方案1】:在接收和处理消息的用例中实现的逻辑,如果出错,您正在执行nack()
将导致无限次重新传递消息。 nack() 的行为是它只会不断地重新传递消息,直到它没有被确认。
nack()
从我们的库存中删除消息并安排重新发送。
我可以建议设置一个dead-letter topic。它的作用是,如果一条消息在设定的期限内没有被确认,它将重试多次。如果达到最大重试次数,消息将被发送到死信主题,并在达到设置的消息保留限制时清除消息。
【讨论】:
惊人的信息,我阅读了 nack 方法,但直到现在我才真正完全理解它。以上是关于如何在 Pubsub 上正确使用 nack?的主要内容,如果未能解决你的问题,请参考以下文章