Azure cosmosdb CosmosDB:如何在插入文档时应用并发性(在并行请求中)

Azure cosmosdb CosmosDB:如何在插入文档时应用并发性(在并行请求中),azure-cosmosdb,Azure Cosmosdb,背景: 我们有一个EventHub,每天记录数千个事件。Azure函数是在新消息到达时在此eventhub上的触发器上配置的。azure函数执行以下两项任务: 将原始消息写入文档数据库(集合1) 将摘要(聚合)消息插入文档数据库的集合2中。在编写消息之前,它会根据分区键和唯一id(非id)检查摘要消息是否已经存在,如果存在文档,则使用新的聚合值更新文档,如果不存在,则插入新文档。此唯一id是基于业务逻辑创建的 问题陈述: 正在为PartitionKey和唯一Id创建多个摘要文档 场景详细信息

背景:

我们有一个EventHub,每天记录数千个事件。Azure函数是在新消息到达时在此eventhub上的触发器上配置的。azure函数执行以下两项任务:

  • 将原始消息写入文档数据库(集合1)
  • 将摘要(聚合)消息插入文档数据库的集合2中。在编写消息之前,它会根据
    分区键
    唯一id
    (非id)检查摘要消息是否已经存在,如果存在文档,则使用新的聚合值更新文档,如果不存在,则插入新文档。此唯一id是基于业务逻辑创建的
  • 问题陈述:

    正在为PartitionKey和唯一Id创建多个摘要文档

    场景详细信息

    • 比如说,对于PartitionKey
      PartitionKey1
      没有摘要 在集合中为计算的
      唯一键创建的文档
    • 多条消息(假设2)到达eventhub并触发了azure函数
    • 所有这两个请求都同时运行,因为使用查询找不到任何现有文档,所以每个请求都会生成一条消息,现在Upsert函数被禁用 几乎同时调用,用于通过并发请求编写摘要文档,结果为一个PartitionKey和唯一Id生成了多个摘要文档

    我已经搜索并阅读了
    乐观并发
    ,我肯定会在更新场景中实现它。但我无法找到任何方法来处理
    insert
    场景?

    根据您的描述,我建议您使用存储过程来实现这一点

    Cosmos DB保证ACID用于作为单个存储过程一部分的所有操作

    正如这位官员所说:如果存储过程注册所针对的集合是单分区集合,那么事务的作用域是集合中的所有文档。如果对集合进行分区,则在单个分区键的事务范围内执行存储过程。然后,每个存储过程执行必须包含一个分区密钥值,该值对应于事务必须运行的范围

    有关Cosmos DB存储过程以及如何创建存储过程的更多信息,请参阅:


    唯一键和行键的作用域都是分区。看起来流处理器ASA(Azure stream Analytics)或Spark可能会在这种情况下帮助您。检查ASA上的屏幕是否有火花。让我检查一下。我的一位同事也提到使用Redis缓存分布式锁来实现它。您认为,我也应该研究一下吗?谢谢Lee,让我检查一下存储过程方法。@user1672994我正在检查这个问题的进展情况。