2

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

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

那么,是否有可能拥有一个函数来监听所有容器中的所有更改,并且可以检测来自哪些容器的更改?

4

2 回答 2

1

简而言之:没有。

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

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

Azure Cosmos DB 中有关更改源的文档明确指出,更改源适用于一个特定容器。

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

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

一种选择可能是创建一个计时器触发的函数,该函数将使用拉模型读取更改提要。这使您能够循环该函数中的容器并准备处理每个容器的更改(例如,通过将信息放入队列或使用具有扇出/扇入模式的持久函数)。

于 2021-01-22T12:35:57.503 回答
1

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

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

这可以以多种方式托管。考虑使用带有 IHostedService 的 ASP.NET Core 应用,并在这种情况下避免使用 Azure Functions。

于 2021-01-22T22:27:29.697 回答