一个 Azure Function,可以监听所有容器的 Cosmos DB Change Feed

问题描述

现在我有一个包含三个不同容器的 Cosmos DB,因此我使用三个不同的函数来监听来自这个 Cosmos DB 的 Change Feed 事件。

将来我的容器数量将从 3 个增加到 100 个。

那么,是否可以有一个函数来监听所有容器中的所有变化,并且可以检测到哪些容器发生了变化?

解决方法

简而言之:没有。

Azure Cosmos DB 中的更改源是对容器的更改按发生顺序的持久记录。 Azure Cosmos DB 中的更改源支持通过侦听 Azure Cosmos 容器 的任何更改来工作。

更改提要可用于容器内的每个逻辑分区键,并且可以分布在一个或多个使用者之间以进行并行处理。

Change feed in Azure Cosmos DB 上的文档明确指出更改供稿适用于一个特定容器。

但是,您可能可以采用不同的方法来解决您的问题。最重要的问题是:您要解决的问题实际上是什么?

如果您需要使用函数处理 Cosmos DB 中的更改,我可以想象处理更改的逻辑对于每种类型的数据可能(将)不同。所以对于每个容器。如果不是,那么数据不必位于不同的容器中?

一种选择是创建一个定时器触发的函数,它将是 Reading change feed with a pull model。这使您能够循环该函数中的容器并准备处理每个容器的更改(例如,通过将信息放入队列或使用带有 Fan-Out/Fan-In pattern 的 Durable Functions)。

,

推荐的 Cosmos DB 模式是拥有一个或几个数据容器,并通过属性值对数据进行逻辑分区,而不是分割成多个容器。如果可能的话,出于更改 Feed 和其他原因,值得审查提议的设计,看看是否有办法整合容器并避免这种痛苦。

也就是说,如果必须支持数量未知且数量不断增加的容器,一种可以动态实现的方法是通过 SDK 使用 Change Feed Processor。使用 GetChangeFeedProcessorBuilder 实例化处理器实例时,您可以提供容器名称作为参数。给定所有目标容器的配置或发现列表,可以创建和并行运行多个更改提要处理器实例。

这可以通过多种方式成为 hosted。考虑将 ASP.NET Core 应用与 IHostedService 结合使用,并在这种情况下避免使用 Azure Functions。