【问题标题】:Access CosmosDB from Azure Function (without input binding)从 Azure Function 访问 CosmosDB(无输入绑定)
【发布时间】:2020-07-26 18:24:26
【问题描述】:

我在 CosmosDB 中有 2 个集合,StocksStockPrices

StockPrices集合保存所有历史价格,并不断更新。

我想创建 Azure 函数来侦听 StockPrices 更新 (CosmosDBTrigger),然后对触发器传递的每个 Document 执行以下操作:

  1. Stocks 集合中查找股票代码匹配
  2. 更新Stocks收藏中的股票价格

我无法使用CosmosDB 输入绑定来执行此操作,因为CosmosDBTrigger 传递了List(绑定仅在触发器传递单个项目时有效)。

我看到这项工作的唯一方法是,如果我在 CosmosDBTrigger 列表中 foreach,并从我的函数体访问 CosmosDB 并执行上面的步骤 1 和 2。

问题:如何从我的函数中访问 CosmosDB?

【问题讨论】:

    标签: azure azure-functions azure-cosmosdb cosmosdbtrigger


    【解决方案1】:

    CosmosDB 的一种绑定形式是获取一个DocumentClient instance,它提供了对容器的全方位操作。这样,您应该能够将更改提要触发器和项目操作组合到同一个函数中,例如:

    [FunctionName("ProcessStockChanges")]
    public async Task Run(
        [CosmosDBTrigger(/* Trigger params */)] IReadOnlyList<Document> changedItems,
        [CosmosDB(/* Client params */)] DocumentClient client,
        ILogger log)
    {
        // Read changedItems, 
        // Create/read/update/delete with client
    }
    

    .NET Core 也可以使用 dependency injection 为您的函数实例提供一个成熟的自定义服务/存储库类,以与 Cosmos 接口。这是我的首选方法,因为我可以使用最新版本的 Cosmos SDK 进行验证、控制序列化等。

    您可能是有意这样做的,但只是提到考虑将您的数据组合到一个容器中,该容器由例如记录类型(Stock/StockPrice)和标识符的组合分区。这简化了事情,并且相对于多个容器可以更节省成本/资源。

    【讨论】:

      【解决方案2】:

      最终接受了@Noah Stahl 的建议。将其留在这里作为替代方案。


      无法弄清楚如何直接执行此操作,因此想出了一个解决方法:

      1. StockPrices 集合上添加带有CosmosDBTrigger 的函数,带有Queue 输出绑定
      2. foreach over Documents 从触发器,序列化并添加到Queue
      3. Stocks 集合添加QueueTriggerCosmosDB 输入绑定(将PartitionKeyId 设置为StockTicker)和CosmosDBStocks 集合输出绑定的函数
      4. 使用来自QueueTrigger 的值从CosmosDB 输入绑定更新Stock
      5. 将更新后的Stock 分配给CosmosDB 输出绑定参数(更新数据库中的记录)

      这就是说,我想听听更直接的方法,因为我的方法似乎是一种 hack。

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 2018-04-03
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多