【发布时间】:2020-04-16 04:56:14
【问题描述】:
最初我们与 google Pub/Sub 的交流流程是这样的:
- 应用程序接受消息
- 检查是否在 idempotencyStore 中不存在
- 3.1 如果不存在 - 将其放入幂等存储(键是唯一标头的值,值是当前时间戳)
3.2 如果存在 - 忽略此消息 - 处理完成后 - 发送确认
- 在确认成功回调中 - 从元数据存储中删除此消息
第 5 点是错误的,因为理论上我们可以在消息处理后得到重复的消息。此外,我们发现即使调用了成功的回调,有时消息也可能不会被删除(Message is received from Google Pub/Sub subscription again and again after acknowledge[Heisenbug])所以我们决定在消息处理后更新值并将时间戳替换为“FiNISHED”字符串
但迟早我们会遇到这张桌子会人满为患的情况。所以我们必须清理 MetaDataStore 中的消息。我们可以删除已处理且处理时间超过 1 天的邮件。
正如https://stackoverflow.com/a/51845202/2674303 的 cmets 中提到的,我可以在 metadataStore 表中添加额外的列,我可以在其中标记是否处理了消息。这根本不是问题。但是我怎样才能在我的清洁器中使用这个标志呢? MetadataStore 只有键和值
【问题讨论】: