Atlas中的智能工作负载管理 (IWM) 策略属于减载策略,即它们会拒绝或终止操作,以使集群在过载情况下保持健康。当这些策略生效时,您的应用程序可能会发现由于服务器过载而被服务器拒绝或终止的操作的新错误。这些过载错误带有SystemOverloadedError 标签。
以下负载卸载 IWM 策略在拒绝或终止操作时会返回错误:
当“自适应操作速率限制器”拒绝操作时,服务器会返回错误并附带 IngressOperationRateLimitExceeded 代码。示例:
{ "ok": 0.0, "errmsg": "Request rejected: ingress operation rate limit exceeded", "code": 463, "codeName": "IngressOperationRateLimitExceeded", "errorLabels": ["SystemOverloadedError", "RetryableError", "NoWritesPerformed"] }
IngressOperationRateLimitExceeded 错误带有 SystemOverloadedError 标签,表示服务器过载并正在减少负载。此标签本身并不平均值可以安全地重试该操作。
要确定错误是否可重试,请检查以下标签:
RetryableError- 操作未执行,可以安全地重试NoWritesPerformed- 在执行任何写入之前,服务器在入口处拒绝了操作
要学习;了解如何实现重载错误的重试逻辑,请参阅 处理过载错误。
当查询哨兵终止低效且长时间运行的查询操作时,服务器会返回错误并附带 InterruptedDueToOverload 代码。示例:
{ "ok": 0, "errmsg": "operation was interrupted", "code": 473, "codeName": "InterruptedDueToOverload", "errorLabels": ["SystemOverloadedError"] }
InterruptedDueToOverload 错误带有 SystemOverloadedError 标签,表示服务器过载并正在减少负载。
InterruptedDueToOverload错误表示服务器终止了操作以保护集群稳定性。此错误未指定为可重试,且不包括RetryableError 标签。如果您重试该操作,请确保它是幂等的并在重试之前等待,以免导致过载。在重试逻辑中使用指数退避和抖动。要学习;了解更多信息,请参阅处理过载错误。
反压感知客户端库版本
反压感知型驱动程序和其他客户端端库会自动识别带有 SystemOverloadedError 标签的过载错误,并将其视为过载信号。如果错误具有导致重试的标签(包括 RetryableError 标签),则反压感知客户端端库会自动使用指数退避和抖动重试操作。
下表列出了具有反压感知功能的最早客户端端库版本:
客户端库 | 最早的背压感知版本 |
|---|---|
C 驱动程序 | 2.3 |
C++ 驱动程序 | 4.3 |
.NET/C# 驱动程序 | 3.8 |
Go 驱动程序 | 2.6 |
Java (Sync) 驱动程序 | 5.7 |
Java Reactive Streams 驱动程序 | 5.7 |
Kotlin Coroutine 驱动程序 | 5.7 |
Kotlin Sync 驱动程序 | 5.7 |
Node.js 驱动程序 | 7.2 |
PHP库 | 2.3 |
pymongo | 4.17 |
Scala 驱动程序 | 5.7 |
如果您使用的是反压感知客户端端库,则无需实现任何额外的重试逻辑来处理IWM 策略的过载错误。如果您使用的不是反压感知的客户端端库,请参阅处理过载错误以获取指导。
处理过载错误
如果您使用的不是反压感知客户端端库,请参阅以下过程,了解如何使用指数退避算法实现错误检测和重试逻辑以处理过载错误: