Azure功能:存在多个活动工作程序时,更改Feed的行为如何?

问题描述

我将Change FeedAzure Functions一起使用。我有一个CosmosDBTrigger分配给每个容器,并具有唯一的LeaseCollectionPrefix。这似乎运行良好,但是当基于消耗的Functions运行时决定扩展并创建多个活动的工作程序时,我不清楚如何处理。

我需要确保多个工作人员不会收到针对相同逻辑分区键的更改,因为我更新了一些汇总信息,并且不希望并发性将其弄乱。 Change Feed推送模型是否为每个活动的工作程序自动分配逻辑分区键范围?还是将更改交付给第一个可用的工作线程,从而使同一逻辑分区键可能出现在多个工作线程中?

解决方法

更改Feed触发器使用Change Feed Processor,see this article for more details

为简单起见,让我们将其范围限制为1个容器。对于特定的集装箱,您的租赁收据中有一组租赁。

当动态缩放决定添加或删除实例时,基本上,租约在实例之间平均分配。每个租约代表容器中一系列分区键值。租约只能由一个实例拥有,一个实例可以拥有多个租约。

这意味着,在正常情况下,更改将始终交付给一个实例(该实例拥有包含文档分区键值的范围的租约)。

尽管,触发器具有“至少一次交付”保证,因为如果在新实例出现且负载均衡开始的同时正在处理租约(读取一组更改),则会有一个有机会在新实例上读取相同的更改。

最重要的是,您应该始终考虑在分布式系统中的两个实例中发生更改的可能性,即使这种可能性很小。