当集群接收到的传入操作超过其资源可以进程时,就会发生过载,并且可能会导致集群完全或几乎完全中断。负载卸载是智能工作负载管理(IWM) 的一项功能,它允许Atlas在长时间过载期间拒绝操作。要为集群配置卸载,请参阅配置智能工作负载管理。
当减载拒绝某个操作时,您的应用程序可能会看到该操作的一个带有 SystemOverloadedError 标签的新错误。此错误表明您的集群过载并正在丢弃操作。
如果您使用反压感知客户端端库,则客户端库会识别这些错误并重试可以安全重试的错误。您的应用程序仍可控制继续重试的时长以及何时卸载负载。要学习;了解更多信息,请参阅处理过载错误。
SystemOverloadedError 标签本身并不平均值可以安全地重试操作。要确定重载错误是否可重试,请检查以下标签:
RetryableError- 操作未执行,可以安全地重试NoWritesPerformed-服务器在执行任何写入之前拒绝了该操作
以下示例显示了当减载拒绝操作时Atlas返回的过载错误:
{ "ok": 0.0, "errmsg": "Request rejected: ingress operation rate limit exceeded", "code": 463, "codeName": "IngressOperationRateLimitExceeded", "errorLabels": ["SystemOverloadedError", "RetryableError", "NoWritesPerformed"] }
重要
如果过载错误不包含 RetryableError 标签,请确保操作是幂等的,并在重试之前等待,以避免导致过载。在重试逻辑中使用指数退避和抖动。
反压感知客户端库版本
反压感知型驱动程序和其他客户端端库会自动识别带有 SystemOverloadedError 标签的过载错误,并将其视为过载信号。如果错误具有导致重试的标签(包括 RetryableError 标签),则反压感知客户端端库会自动使用指数退避和抖动重试操作。
下表列出了具有反压感知功能的最早客户端库版本:
客户端库 | 最早的背压感知版本 |
|---|---|
C 驱动程序 | 2.5 |
C++ 驱动程序 | 4.6 |
.NET/C# 驱动程序 | 3.11 |
Go 驱动程序 | 2.9 |
Java (Sync) 驱动程序 | 5.12 |
Java Reactive Streams 驱动程序 | 5.12 |
Kotlin Coroutine 驱动程序 | 5.12 |
Kotlin Sync 驱动程序 | 5.12 |
Node.js 驱动程序 | 7.6 |
PHP库 | 2.5;需要 |
pymongo | 4.18 |
Scala 驱动程序 | 5.12 |
Ruby | 2.26 |
Rust | 3.9 |
处理过载错误
即使您使用反压感知客户端端库,也能处理应用程序中的过载错误。具有反压感知能力的客户端端库会重试标记为可重试的操作,但您的应用程序会决定继续重试的时长,以及何时通过放弃集群继续拒绝的操作来卸载负载。如果您使用的不是反压感知客户端端库,还需自行实现错误检测和重试逻辑。
有关如何实现错误检测和重试逻辑,以处理标记为可重试的过载错误,请参阅以下过程的示例: