如何清理 JdbcMetadataStore?

How to cleanup the JdbcMetadataStore?

最初我们与 google Pub/Sub 的交流流程是这样的:

  1. 应用程序接受消息
  2. 检查它不存在于 idempotencyStore
  3. 3.1 如果不存在-将其放入幂等存储(键是唯一值header,值是当前时间戳)
    3.2 如果存在 - 忽略此消息
  4. 处理完成后 - 发送确认
  5. 在确认成功回调中 - 从元数据存储中删除此消息

第 5 点是错误的,因为理论上我们可以在消息处理后得到重复的消息。此外,我们发现有时即使调用了成功的回调也可能不会删除消息(Message is received from Google Pub/Sub subscription again and again after acknowledge[Heisenbug])因此我们决定在处理消息后更新值并将时间戳替换为 "FiNISHED" 字符串

但迟早会遇到这个table人满为患的情况。所以我们必须清理 MetaDataStore 中的消息。我们可以删除已处理且处理时间超过 1 天的邮件。

正如 的评论中提到的,我可以在 metadataStore table 中添加额外的列,我可以在其中标记消息是否已处理。这根本不是问题。但是我怎样才能在我的清洁器中使用这个标志呢? MetadataStore 只有 key 和 value

In the acknowledge successfull callback - remove this msg from metadatastore

我完全看不出这一步的原因。

既然你说你在 value 中存储了一个时间戳,这意味着你可以不时地分析这个 table 以删除绝对旧的条目。

在我的一些项目中,我们在数据库中有一项日常工作,即归档 table 以获得更好的主进程性能。是的,只是因为我们不再需要旧数据了。出于这个原因,我们肯定会检查原始文件中的一些时间戳,以确定是否应该将其归档。我不会在处理后立即删除数据,只是因为有机会从外部系统重新传送。

另一方面,为了获得更好的性能,我会在该元数据 table 中添加带有 timestamp 类型的额外索引列,并在每次更新或插入时通过触发器填充一个值。那么,MetadataStore 只需从 MetadataStoreSelector:

中插入一个条目
return this.metadataStore.putIfAbsent(key, value) == null;

因此,您需要一个 on_insert 触发器来填充该日期列。通过这种方式,您最终会知道是否需要删除条目。