如何在 Pubsub 上正确使用 nack?

How to use nack on Pubsub properly?

我正在从 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
  }

谢谢!

在接收和处理消息的用例中实现的逻辑,如果它出错,您正在做 nack() 将导致无限次重新传递消息。 nack() 的行为是它会不断地重新传递消息,直到它没有被确认。

nack()

Removes the message from our inventory and schedules it to be redelivered.

我可以建议设置一个 dead-letter topic。它的作用是,如果消息在设定的截止日期内未被确认,它将重试多次。如果达到最大重试次数,消息将被发送到死信主题,并在达到设置的消息保留限制时清除消息。