【问题标题】:How to guarantee CosmosDB data is up to date with ServiceBus, not overridden by Deadletter messages如何使用 ServiceBus 保证 CosmosDB 数据是最新的,而不是被 Deadletter 消息覆盖
【发布时间】:2018-02-13 13:31:56
【问题描述】:

我有一个关于使用 a 的实现的问题:

  • CosmosDB
  • 服务总线 + DLQ

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

是否有任何“更清洁”的方法来解决这个问题?

【问题讨论】:

    标签: c# azure azure-sql-database azure-table-storage azureservicebus


    【解决方案1】:

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

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

    • 确保您的设计是idempotent。您可以使用排队时间和/或correlation id 来管理订单以帮助实现幂等性。我会将其作为数组添加到 CosmosDB 文档中,并避免使用其他数据存储来减少可能的故障点。

    • 1234563战略。

    【讨论】:

      猜你喜欢
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多