Azure cosmos changefeed 处理器选项
Azure cosmos changefeed Processor options
Changefeed 处理器选项描述得很好 here -
我对此没什么疑问 -
leaseRenewInterval
:假设实例无法在17s(默认租约更新间隔)内续租,是否会从该实例中删除租约?还是 feed 会等到 leaseExpirationInterval
从中删除租约并给它机会在 60 秒内重新获得租约?
默认情况下 leaseRenew
会发生在 checkpoint
之后,还是两者是独立的?即 leaseRenew 可以在 leaserenewinterval
之后在单独的线程上发生,而其他线程仍在处理批处理?
我们看到了错误:failed to checkpoint for owner 'null' with continuation token.
怎么会这样?为什么owner可以成为null
?
我们也看到了异常LeaseLostException
。即使 pod/instance 没有关闭,也会发生这种情况吗?我们不期望任何负载平衡,因为那里只有 1 个物理分区,但希望我们的系统具有容错能力,因此我们有多个实例 运行,其中除 1 以外的所有其他实例将始终等待租约获取。
很少有实例可以看到,同时有3个pods/instance拥有同一个物理分区的租约,或者可以说,他们获得了同一个租约。 (我们最多可以有 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
- 当前实例不会删除未续订的租约。其他实例可以“认为”租约没有续签是因为当前所有者崩溃了,所以它们会“偷走”它们。通常发生在租约未在到期时间之前accessed/updated。
- 独立。可能没有检查点(没有新的变化)并且租约仍然会得到更新。
- 这听起来像是释放了租约,然后尝试检查点。不确定您使用的是哪个 CFP 版本或哪个是您的间隔配置。
- 您要自定义任何间隔吗?如果是这样,那可能会导致租约丢失(被其他实例检测为已过期)。
- 与之前相同的问题,这可能发生在负载平衡期间或因为检测到租约已过期。
请分享您使用的是哪个 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.
Changefeed 处理器选项描述得很好 here -
我对此没什么疑问 -
leaseRenewInterval
:假设实例无法在17s(默认租约更新间隔)内续租,是否会从该实例中删除租约?还是 feed 会等到leaseExpirationInterval
从中删除租约并给它机会在 60 秒内重新获得租约?默认情况下
leaseRenew
会发生在checkpoint
之后,还是两者是独立的?即 leaseRenew 可以在leaserenewinterval
之后在单独的线程上发生,而其他线程仍在处理批处理?我们看到了错误:
failed to checkpoint for owner 'null' with continuation token.
怎么会这样?为什么owner可以成为null
?我们也看到了异常
LeaseLostException
。即使 pod/instance 没有关闭,也会发生这种情况吗?我们不期望任何负载平衡,因为那里只有 1 个物理分区,但希望我们的系统具有容错能力,因此我们有多个实例 运行,其中除 1 以外的所有其他实例将始终等待租约获取。很少有实例可以看到,同时有3个pods/instance拥有同一个物理分区的租约,或者可以说,他们获得了同一个租约。 (我们最多可以有 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
- 当前实例不会删除未续订的租约。其他实例可以“认为”租约没有续签是因为当前所有者崩溃了,所以它们会“偷走”它们。通常发生在租约未在到期时间之前accessed/updated。
- 独立。可能没有检查点(没有新的变化)并且租约仍然会得到更新。
- 这听起来像是释放了租约,然后尝试检查点。不确定您使用的是哪个 CFP 版本或哪个是您的间隔配置。
- 您要自定义任何间隔吗?如果是这样,那可能会导致租约丢失(被其他实例检测为已过期)。
- 与之前相同的问题,这可能发生在负载平衡期间或因为检测到租约已过期。
请分享您使用的是哪个 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.