如何清理 JdbcMetadataStore?
How to cleanup the JdbcMetadataStore?
最初我们与 google Pub/Sub 的交流流程是这样的:
- 应用程序接受消息
- 检查它不存在于 idempotencyStore
- 3.1 如果不存在-将其放入幂等存储(键是唯一值header,值是当前时间戳)
3.2 如果存在 - 忽略此消息
- 处理完成后 - 发送确认
- 在确认成功回调中 - 从元数据存储中删除此消息
第 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 触发器来填充该日期列。通过这种方式,您最终会知道是否需要删除条目。
最初我们与 google Pub/Sub 的交流流程是这样的:
- 应用程序接受消息
- 检查它不存在于 idempotencyStore
- 3.1 如果不存在-将其放入幂等存储(键是唯一值header,值是当前时间戳)
3.2 如果存在 - 忽略此消息 - 处理完成后 - 发送确认
- 在确认成功回调中 - 从元数据存储中删除此消息
第 5 点是错误的,因为理论上我们可以在消息处理后得到重复的消息。此外,我们发现有时即使调用了成功的回调也可能不会删除消息(Message is received from Google Pub/Sub subscription again and again after acknowledge[Heisenbug])因此我们决定在处理消息后更新值并将时间戳替换为 "FiNISHED" 字符串
但迟早会遇到这个table人满为患的情况。所以我们必须清理 MetaDataStore 中的消息。我们可以删除已处理且处理时间超过 1 天的邮件。
正如
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 触发器来填充该日期列。通过这种方式,您最终会知道是否需要删除条目。