Cosmo Db sql Azure-并行读取唯一文档

时间:2018-07-26 12:59:42

标签: azure azure-cosmosdb

我们拥有与cosmos DB文档进行交互的服务。每个服务都有多个实例,因此可以并行获取文档。

我们的要求是确保每个实例都只能提取/处理唯一的文档。我有主服务"S",有实例s1,s2,s3,s4,有文档d1,d2,d3,d4.........d20。我们需要s1仅提取第一批(D1,d2,d3,d4,d5),而其他实例不应提取相同的文档。每个实例应具有唯一的批处理文档。输出应如下所示

s1-处理d1,d2,d3,d4,d5

s2- d6,d7,d8,d9,10

s3-d11,d12,d13,d14,d15

s4-d16,17,18,19,20。

我正在寻找的是:

  • cosmo DB中的任何读取和锁定文档机制-如果是,我可以使用它们将文档锁定n秒钟,以便另一个服务实例不要选择它们。任何内置标志。
  • 如果我们没有任何内置机制,则可以使用标签或存储过程来替换docs并添加一个反映其状态的新属性(锁定)。但是我不确定两个服务实例将尝试同时写入/替换并且两者都将能够锁定它的情况。

1 个答案:

答案 0 :(得分:0)

  

1.cosmo DB中的任何读取和锁定文档机制-如果是,我可以使用它们将文档锁定n秒钟,以便另一个服务实例   不应该接他们。任何内置标志。

我知道,cosmos db中没有这样的锁定机制,因此我们可以防止它们被服务选择。

  

2。如果我们没有任何内置的机制,那么我可以使用标签或存储过程来替换docs并添加一个新属性来反映   他们的状态(锁定)。但是我不确定两个   服务实例将尝试同时写入/替换,并且两者都   将能够锁定它。

我建议您添加分区键,例如batchId。 Cosmos DB保证单个存储过程中所有操作的ACID。

  

在Cosmos DB中,JavaScript托管在与数据库相同的内存空间中。因此,在存储过程和触发器内发出的请求在数据库会话的相同范围内执行。这样一来,Cosmos DB就可以为单个存储过程/触发器一部分中的所有操作保证ACID。

您可以在此official doc数据库程序交易中找到上述说明。

此外,存储过程或触发器的consistency level由您设置的cosmos DB帐户的consistency level确定,如官方文档中所述。

Cosmos DB提供five consistency levels

我不确定您设置哪个一致性级别,可能只是默认的Session一致性级别。

Session一致性级别仅可确保Session生命周期中的高度一致性。 因此,您测试的存储过程不能同时运行。会有一些重叠。后续更新将覆盖先前的更新。

解决方案:

  1. 您可以尝试将一致性级别更改为Strong。这样可以确保最强的一致性,但会增加延迟。

  2. 或者您可以在业务布局中添加transaction locks,以确保高度一致性。

希望它对您有帮助。