google-cloud-pubsub - GCP pubsub:为什么快速发布 20 万条消息会导致该主题的 250 万条消息
问题描述
前提条件:
- 我们创建了一个空主题,只有一个拉订阅
- 没有服务主动订阅订阅
@google/pubsub
我们使用该库快速发布大约 20 万条消息
观察:
当我们使用下面的等效代码发布消息时,消息量达到了 250 万条。从日志消息中我们看到它认为它发布了 200k 条消息。
第二个小问题是我们使用下面的代码,但将调用与另一个 for 循环分块Promise.all
,并且一次只给 pubsub sdk 1000 条消息。
代码:
import {PubSub} from '@google-cloud/pubsub';
const pubsub = new PubSub()
const topic = pubsub.topic("some-topic");
async function publish(message) {
const dataBuffer = Buffer.from(JSON.stringify(data));
return topic.publisher.publish(dataBuffer, metadata);
}
async function processThing(thing) {
const parsed = parseThingToLotsOfThings(thing);
return (await Promise.all(
parsed.map(it => topic.publish(it))
)).length
}
async function processThings(things) {
let count = 0;
for (const thing of things) {
count += await processThing(thing);
}
console.log(`published ${count} messages`);
}
通过阅读 nodejs sdk 源代码和查看 API 参考,我不明白这是怎么回事。
我意识到这是至少一次交付的保证,但这要多一个数量级,并且在内部客户端每次发布 rpc 调用仅包含 100 条消息,所以我不明白为什么在我们的代码中对其进行批处理会改变行为。
这是 sdk 中的错误,还是我们应该在调用 sdk 之前进行批处理?
解决方案
推荐阅读
- excel - VBA - 日期时间字符串替换/替换
- sql - 如何在postgresql的查询中一起转换列和函数之间的使用
- r - 总结选定的行重复项
- conemu - 如何在 Cmder (ConEmu) 的当前选项卡中执行命令
- android - ImageView drawable 未在 MarshMallow 上显示
- vb.net - 每次显示或加载表单时用当前日期填充一列
- c# - 如何将图像作为字节数组从 Angular 9 发送到 C# Web API Core,就像对象的属性一样?带有图像的 CRUD 客户端应用程序
- javascript - 获取第三个文本内容
里面的元素
元素 - git - Git:定期将回购复制到公司外部无法访问的另一个回购
- python - 如何使用 Python,Beautifulsoup 仅抓取包含在 DIV 元素中的印地语内容,没有任何类或 id?