0

Changefeed 处理器选项在这里得到了很好的描述-

我对此有几个问题-

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

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

  3. 我们已经看到了错误:failed to checkpoint for owner 'null' with continuation token.这怎么会发生?为什么所有者可以成为null

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

  5. 在少数情况下,我们可以同时看到 3 个 Pod/实例具有相同物理分区的租约,或者我们可以说,它们获得了相同的租约。(我们最多可以有 1 个物理分区,(文档的 TTL 为 3 天,存储空间更少,因此我们预计不会超过 1 个物理分区))。这怎么可能发生?

编辑:

当前的设置:

leaseRenewInterval : 17s

leaseAcquireInterval: 13s

leaseExpirationInterval: 60s

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

ChangeFeed 处理器版本:

  • 我们在我们的 Maven 中使用下面
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-cosmos</artifactId>
            <version>4.8.0</version>
        </dependency>

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

4

1 回答 1

1
  1. 当前实例不会删除未续订的租约。其他实例可以“认为”租约没有续签是因为当前所有者崩溃了,所以他们会“窃取”它们。通常在到期时间之前未访问/更新租约时发生。
  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。

于 2021-07-06T22:32:33.407 回答