如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

微服务和 PubSub:如何确保服务使用正确的事件

如何正确接收 Pubsub JSON 数据?

如何在 pubsub 节点上发送/接收自定义项目有效负载

如何强制 RabbitMQ 代理 NACK 测试消息?

在 GCP 上使用 Pubsub 时如何解决身份验证范围不足的问题

如何在 Firebase Cloud Functions 中确认 PubSub 消息?