如何保证 CosmosDB 数据与 ServiceBus 保持同步,而不被 Deadletter 消息覆盖

How to guarantee CosmosDB data is up to date with ServiceBus, not overridden by Deadletter messages

我对使用 a 的实现有疑问:

我有一个服务总线触发器,它触发、处理传入数据,然后使用 Upsert 将其存储在 CosmosDB 中。如果一条消息在处理过程中失败,我会将其存储在死信队列 (DLQ) 中,稍后将根据请求发送该队列。这可能会导致我将从 DLQ 重新发送一条(更旧的)消息,这将覆盖数据库中的 "newer" 对象。今天,我使用 Table 来存储时间戳,以确保对象的最新更新时间。更好的方法是调查存储文档的时间戳与传入 ServiceBus 消息的入队时间 属性,但这不适用于非持久性数据库。

有什么 "cleaner" 方法可以解决这个问题吗?

以下是一些可以帮助您思考解决方案的方面:

  • 使用Service Bus transaction确保在完成消息之前完成所有相关工作。如果 CosmosDB upsert 失败,则放弃重试消息。

  • 确保您的设计是idempotent. You can use the enqueued time and/or a correlation id管理顺序以帮助实现幂等性。我会将其作为数组添加到 CosmosDB 文档中,并避免使用其他数据存储来减少可能的故障点。

  • 还要确保您为您的用例选择了正确的 CosmosDB consistency level,如果您要处理大量数据,那么您将需要考虑此功能的重要性并可能使用您在分区策略中的关联 ID。