我们拥有与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。
我正在寻找的是:
答案 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生命周期中的高度一致性。
因此,您测试的存储过程不能同时运行。会有一些重叠。后续更新将覆盖先前的更新。
解决方案:
您可以尝试将一致性级别更改为Strong
。这样可以确保最强的一致性,但会增加延迟。
或者您可以在业务布局中添加transaction locks
,以确保高度一致性。
希望它对您有帮助。