gpt4 book ai didi

c# - CosmosDb 的并发问题

转载 作者:行者123 更新时间:2023-12-02 23:41:46 24 4
gpt4 key购买 nike

我们正在努力解决由于竞争条件而创建的重复文档。我们处理事件并创建或更新文档。我们注意到,如果我们在几毫秒内收到两个事件,我们就会创建重复的文档。第一个事件应该生成新文档,第二个事件应该是更新。

这是我们在存储的产品中的逻辑。

  1. 查找具有特定 ID 和状态的现有文档
  2. 创建新文档或更新现有文档(如果存在)。
  3. 如果创建,我们会再进行一次选择,以检查是否只有一个包含 id 和 status 组合的文档。如果超过1,则回滚。如果有更新,我们依赖 Etag。

我们对更新感到满意,但创建却给我们带来了困难。让我知道是否有办法解决它。去重键是外部 id 和状态的组合。我们有一个现有的数据库,我们希望避免任何需要创建新数据库的更改。

谢谢,罗希特

最佳答案

定义 unique key 。 CosmosDB 将防止插入指定为唯一的重复键。然后您可以捕获异常并执行更新逻辑。

根据反馈进行编辑

我假设您所处的环境中有多个线程或进程正在执行此逻辑。当您尝试处理每个文档时,您将需要一个关键部分(锁)。当需要与 CosmosDB 交互时,您需要获取要插入/更新的文档 ID 的锁。然后,您可以检查文档是否存在,并根据结果进行插入或更新。然后,您将通过释放锁来退出临界区。

根据您所使用的技术,您可以使用哪些技术。如果它是 Azure Function 的单个实例,您可以使用静态 ThreadSafeDictionary 之类的东西进行锁定。如果是多个 Azure Functions 或 Web Apps,则需要分布式锁。有多种方法可以实现此目的,例如 Azure Blob Leases。

我不知道 CosmosDB 中提供任何类型的 OOTB 同步功能。

关于c# - CosmosDb 的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59569152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com