繁体   English   中英

GCP PubSub 排序不排序消息

[英]GCP PubSub ordering does not order messages

我正在尝试将 GCP pubsub 排序功能与节点 js 一起使用。 我正在发送几条具有相同排序键的消息,在第一条消息得到确认后,我收到了一堆中的所有其他消息,但没有按顺序接收。 您可以在屏幕上看到该行为。 看看时间戳。 为什么会这样? 据我了解,在确认前一条消息后,我应该只收到另一条消息。 结果

发布消息的代码:

const main = async () => {
  const pubSubClient = new PubSub()

  const keys = ['a', 'a', 'a']
  for (let i = 0; i < keys.length; ++i) {
    console.log(chalk.green(`Sending message ${i + 1}, ordering key - ${keys[i]}`))
    await pubSubClient
      .topic('test-topic', { messageOrdering: true })
      .publishMessage({
        orderingKey: keys[i],
        data: Buffer.from(`Msg ${i + 1}`)
      })
  }
}

拉取消息的代码:

const main = async () => {
  const pubSubClient = new PubSub()

  const handleMsg = async (message: Message) => {
    const dataStr = Buffer.from((message.data as unknown) as string, 'base64').toString('utf-8')

    console.log(chalk.green(`Got message ${dataStr}, orderingKey - ${message.orderingKey}, ${new Date().toISOString()}`))
    // some processing happens here
    await sleep(10000)

    console.log(chalk.yellow(`Message ack ${dataStr}, orderingKey - ${message.orderingKey}, ${new Date().toISOString()}`))
    message.ack()
  }

  const subscription = pubSubClient.subscription('test-subscription')

  subscription.on('message', handleMsg)

  console.log('started listening...')
}

该过程运作良好。 没有问题或问题。

您的程序是连接到 PubSub 订阅的订阅者。 一个订阅可以有多个订阅者。 因此,PubSub 向一个订阅者发送第一条消息(在您的情况下是唯一一个,但 PubSub 不知道这一点)。

第一条消息很好地确认了该“订阅者”,PubSub 选择传递其他消息。 为了优化网络,PubSub 将消息批量传递给客户端(这就是为什么你有相同的时间戳)。 但是,消息在您的程序中按顺序处理; PubSub 客户端库确保该顺序。

在一天结束时,您会收到所有消息并按顺序处理它们。 任务完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM