问题描述
我将Change Feed
与Azure Functions
一起使用。我有一个CosmosDBTrigger
分配给每个容器,并具有唯一的LeaseCollectionPrefix
。这似乎运行良好,但是当基于消耗的Functions
运行时决定扩展并创建多个活动的工作程序时,我不清楚如何处理。
我需要确保多个工作人员不会收到针对相同逻辑分区键的更改,因为我更新了一些汇总信息,并且不希望并发性将其弄乱。 Change Feed
推送模型是否为每个活动的工作程序自动分配逻辑分区键范围?还是将更改交付给第一个可用的工作线程,从而使同一逻辑分区键可能出现在多个工作线程中?
解决方法
更改Feed触发器使用Change Feed Processor,see this article for more details。
为简单起见,让我们将其范围限制为1个容器。对于特定的集装箱,您的租赁收据中有一组租赁。
当动态缩放决定添加或删除实例时,基本上,租约在实例之间平均分配。每个租约代表容器中一系列分区键值。租约只能由一个实例拥有,一个实例可以拥有多个租约。
这意味着,在正常情况下,更改将始终交付给一个实例(该实例拥有包含文档分区键值的范围的租约)。
尽管,触发器具有“至少一次交付”保证,因为如果在新实例出现且负载均衡开始的同时正在处理租约(读取一组更改),则会有一个有机会在新实例上读取相同的更改。
最重要的是,您应该始终考虑在分布式系统中的两个实例中发生更改的可能性,即使这种可能性很小。