我正在尝试使用GCP发布订阅排序功能与节点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客户端库确保顺序。
在一天结束时,你收到所有的消息并按顺序处理它们。工作。