【发布时间】:2021-09-05 19:48:52
【问题描述】:
使用 google PubSub 批处理和 orderingKey 时出现不稳定的行为。 如果我使用批量 PubSub 而不使用 orderingKey,代码将按预期工作:
console.log( `Start: [${new Date().toISOString()}]` );
const array = [ ...Array( 5 ).keys() ];
const topic = pubSubClient.topic( 'topic_test', {
batching: {
maxMessages: array.length,
maxMilliseconds: 10 * 1000,
},
} );
await Promise.all(
array.map( async ( item ) => {
const messageId = await topic.publish( Buffer.from( JSON.stringify( item ) ) );
console.log( `[${new Date().toISOString()}] Message ${messageId} published. id: ${item}` );
} )
);
我无需等待即可立即获得结果:
Start: [2021-06-22T07:47:01.187Z]
[2021-06-22T07:47:01.187Z] Message 2578553779341346 published. id: 0
[2021-06-22T07:47:01.188Z] Message 2578553779341347 published. id: 1
[2021-06-22T07:47:01.188Z] Message 2578553779341348 published. id: 2
[2021-06-22T07:47:01.188Z] Message 2578553779341349 published. id: 3
[2021-06-22T07:47:01.188Z] Message 2578553779341350 published. id: 4
但如果我将 orderingKey 与批处理一起添加:
console.log( `Start: [${new Date().toISOString()}]` );
const array = [ ...Array( 5 ).keys() ];
const topic = pubSubClient.topic( 'topic_test', {
enableMessageOrdering: true,
batching: {
maxMessages: array.length,
maxMilliseconds: 10 * 1000,
},
} );
await Promise.all(
array.map( async ( item ) => {
const messageId = await topic.publishMessage( {
data: Buffer.from( JSON.stringify( item ) ),
orderingKey: item,
} );
console.log( `[${new Date().toISOString()}] Message ${messageId} published. id: ${item}` );
} )
);
批次仅在 10 秒后发送(以 maxMilliseconds 为单位),即使之前已满足 maxMessages 条件:
Start: [2021-06-22T07:54:31.287Z]
[2021-06-22T07:54:41.995Z] Message 2578621698696149 published. id: 1
[2021-06-22T07:54:41.995Z] Message 2578554178769363 published. id: 4
[2021-06-22T07:54:41.996Z] Message 2578622069514679 published. id: 3
[2021-06-22T07:54:41.996Z] Message 2578621502622110 published. id: 0
[2021-06-22T07:54:42.058Z] Message 2578621667693212 published. id: 2
我该如何解决?
【问题讨论】:
标签: node.js publish-subscribe google-cloud-pubsub