You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Cosmos DB变更推送模型如何并行处理不同分区范围?

Azure Cosmos DB 变更源处理器推送模型的分区范围分配问题

核心结论

变更源处理器(推送模型)不支持手动指定分区范围,它完全依赖租约容器实现自动化的分区范围负载均衡,无需开发者手动配置分区映射。而拉取模型(ChangeFeedIterator)确实支持通过WithPartitionKey手动指定要拉取的分区。

测试未实现横向扩展的原因排查

你在模拟器中测试时出现单实例接收所有变更的情况,通常是以下配置问题导致的:

  • 租约容器未配置分区键:租约容器必须设置分区键(推荐用/id),否则无法支持多实例的租约分配,所有实例会争抢同一个租约,最终只有一个实例能处理全部分区。
  • 实例的processorName不一致:所有属于同一个处理器组的实例必须使用相同的processorName,否则它们会被视为独立的处理器组,各自独立处理全部分区。
  • 实例名(WithInstanceName)重复:每个实例必须设置唯一的实例名,租约容器需要通过实例名区分不同的消费者实例,才能将不同分区范围分配给不同实例。
  • 源容器分区数不足:如果源容器只有1个物理分区,变更源处理器无法将分区拆分给多个实例,自然无法实现横向扩展。
  • 模拟器版本过旧:旧版Cosmos DB模拟器可能存在变更源处理器的负载均衡bug,建议升级到最新版本测试。

修正后的多实例示例代码

两个实例需保证processorName一致、instanceName唯一:

实例1

ChangeFeedProcessor changeFeedProcessor = cosmosClient.GetContainer(databaseName, sourceContainerName)
        .GetChangeFeedProcessorBuilder<ToDoItem>(processorName: "changeFeedSample", onChangesDelegate: HandleChangesAsync)
            .WithInstanceName("console-host-01")
            .WithLeaseContainer(leaseContainer)
            .Build();

实例2

ChangeFeedProcessor changeFeedProcessor = cosmosClient.GetContainer(databaseName, sourceContainerName)
        .GetChangeFeedProcessorBuilder<ToDoItem>(processorName: "changeFeedSample", onChangesDelegate: HandleChangesAsync)
            .WithInstanceName("console-host-02")
            .WithLeaseContainer(leaseContainer)
            .Build();

额外说明

变更源处理器的设计目标就是自动实现多实例的负载均衡,开发者只需保证租约容器配置正确、实例参数符合要求,处理器会自动将源容器的分区范围均匀分配给各个实例,无需手动干预分区映射。

内容的提问来源于stack exchange,提问作者Frank Q.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:40:45