Azure cosmos changefeed 处理器选项

Azure cosmos changefeed Processor options

Changefeed 处理器选项描述得很好 here -

我对此没什么疑问 -

  1. leaseRenewInterval:假设实例无法在17s(默认租约更新间隔)内续租,是否会从该实例中删除租约?还是 feed 会等到 leaseExpirationInterval 从中删除租约并给它机会在 60 秒内重新获得租约?

  2. 默认情况下 leaseRenew 会发生在 checkpoint 之后,还是两者是独立的?即 leaseRenew 可以在 leaserenewinterval 之后在单独的线程上发生,而其他线程仍在处理批处理?

  3. 我们看到了错误:failed to checkpoint for owner 'null' with continuation token.怎么会这样?为什么owner可以成为null?

  4. 我们也看到了异常LeaseLostException。即使 pod/instance 没有关闭,也会发生这种情况吗?我们不期望任何负载平衡,因为那里只有 1 个物理分区,但希望我们的系统具有容错能力,因此我们有多个实例 运行,其中除 1 以外的所有其他实例将始终等待租约获取。

  5. 很少有实例可以看到,同时有3个pods/instance拥有同一个物理分区的租约,或者可以说,他们获得了同一个租约。 (我们最多可以有 1 个物理分区,(文档的 TTL 为 3 天,存储空间较少,因此我们预计物理分区不会超过 1 个))。这怎么会发生?

编辑:

当前设置:

leaseRenewInterval : 17s

leaseAcquireInterval: 13s

leaseExpirationInterval: 60s

feedPollDelay: 2s [only this is not the default]

ChangeFeed 处理器版本:

        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-cosmos</artifactId>
            <version>4.8.0</version>
        </dependency>

所以,我可以假设 CFP 版本是 4.8.0

  1. 当前实例不会删除未续订的租约。其他实例可以“认为”租约没有续签是因为当前所有者崩溃了,所以它们会“偷走”它们。通常发生在租约未在到期时间之前accessed/updated。
  2. 独立。可能没有检查点(没有新的变化)并且租约仍然会得到更新。
  3. 这听起来像是释放了租约,然后尝试检查点。不确定您使用的是哪个 CFP 版本或哪个是您的间隔配置。
  4. 您要自定义任何间隔吗?如果是这样,那可能会导致租约丢失(被其他实例检测为已过期)。
  5. 与之前相同的问题,这可能发生在负载平衡期间或因为检测到租约已过期。

请分享您使用的是哪个 CFP 版本以及有哪些选项。通常,除非您非常确定自己在做什么,否则我不建议更改任何间隔。

编辑:根据新信息。我不熟悉 Java CFP,但是当实例数量高于租约时,在其他实例之间负载平衡租约虽然不理想,但应该不是问题,因为租约仍将被拥有并且1台机器加工。我会尝试的唯一建议是使用最新的 maven 包版本。较新版本 (https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-sdk-java-v4#4140-2021-04-06) 对 CFP 进行了修复,因此请尝试 4.15.0.