针对多区域AKS的Azure cosmos更改订阅源处理器面临问题



我们在AKS的单个Region中部署了自定义的Change Feed处理器,有5个实例。事情总是在一个地区运行良好。(请注意,每个pod实例(提要处理器(都被分配了一个唯一的[.WithInstanceName(新GUID(]。

我们最近转向多区域设置如下:

  • EastUS AKS集群=5个pod(每个实例名称唯一的5个提要处理器(
  • WestUS AKS集群=5个pod(每个实例名称唯一的5个提要处理器(

现在使用上面的设置,结果不是很一致,因为有时在AKS服务部署之后,我们的feedprocessor停止接收某些集合的事件(。

为了解决这个问题,我们需要最终删除租赁集合,然后一切都重新开始工作。

我们无法使用上述解决方法,因此需要帮助来解决问题。

以下是代码片段:

Container leaseContainer = cosmosClient.GetContainer(databaseName, leaseContainerName);
changeFeedProcessor = cosmosClient.GetContainer(databaseName, sourceContainerName)
.GetChangeFeedProcessorBuilder(processorName: sourceContainerName, async (IReadOnlyCollection<TContainer> changes, CancellationToken cancellationToken) => await onChangesDelegate(changes, cancellationToken))
.WithInstanceName($"{Guid.NewGuid()}")
.WithLeaseContainer(leaseContainer)
.Build();

其中leaseContainerName=";集装箱租赁";

问题是您正在混合实例。如果希望每个区域独立工作(相同的文档更改将独立地分配给两组处理程序(,请设置不同的processorName

当您定义具有特定processorName、租赁和监控容器的计算机集群时,您就定义了部署单元。更改提要事件分布在这些机器上。

如果您部署了两个集群,但具有相同的值,那么这10个吊舱现在是同一个部署单元,因此更改分布在10个吊舱中,这意味着现在特定的更改将出现在其中一个区域的一个实例中,但另一个区域将看不到它。

您可以将区域名称设置为processorName,例如:

Container leaseContainer = cosmosClient.GetContainer(databaseName, leaseContainerName);
changeFeedProcessor = cosmosClient.GetContainer(databaseName, sourceContainerName)
.GetChangeFeedProcessorBuilder(processorName: regionName, async (IReadOnlyCollection<TContainer> changes, CancellationToken cancellationToken) => await onChangesDelegate(changes, cancellationToken))
.WithInstanceName($"{Guid.NewGuid()}")
.WithLeaseContainer(leaseContainer)
.Build();

最新更新