对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

处理负载削减导致的过载错误

当集群接收的入站操作数量超过其资源可处理的数量时,就会发生负载过载,这可能会导致集群完全或接近完全的服务中断。负载削减是 智能工作负载管理 (IWM) 的一项功能,允许 Atlas 在长时间过载期间拒绝操作。要为集群配置负载卸载,请参阅 配置智能工作负载管理。

当负载削减 (Load Shedding) 拒绝某项操作时,您的应用程序可能会看到该操作出现一个带有 SystemOverloadedError 标签的新错误。此错误表明您的集群已过载并正在削减操作。

如果您使用支持背压的客户端库,客户端库会识别这些错误并重试那些可以安全重试的错误。您的应用程序仍然可以控制重试的时长以及何时减少负载。要了解更多信息,请参阅处理过载错误。

SystemOverloadedError 标签单独存在时,并不意味着该操作可以安全地重试。要确定负载错误是否可重试,请检查以下标签:

  • RetryableError - 操作未执行,可以安全地重试

  • NoWritesPerformed - 服务器在执行任何写入操作之前拒绝了该操作

以下示例展示了当负载削减(Load Shedding)拒绝操作时 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;需要 mongodb PHP 扩展 (PHPC) 2.5.0+

pymongo

4.18

Scala 驱动程序

5.12

Ruby

2.26

Rust

3.9

即使您使用支持背压的客户端库,也应在应用程序中处理过载错误。支持背压的客户端库会重试标记为可重试的操作,但您的应用程序决定了重试持续的时间,以及何时通过放弃集群持续拒绝的操作来减轻负载。如果您没有使用支持背压的客户端库,也请自行实现错误检测和重试逻辑。

请参阅以下过程,了解如何实现错误检测和带有指数退避的重试逻辑的示例,以处理标记为可重试的过载错误:

接口

使用以下过程实现实用程序,以检测过载错误并使用指数退避重试。

在重试因过载错误而失败的操作时,请遵循以下准则,以避免加剧过载并提高重试成功的几率:

  • 限制重试次数:每个操作最多重试两次。较高的限制可以降低错误率,但在过载期间会增加服务器负载;而较少的重试次数可以减少服务器负载,但会增加错误率。

  • 有选择地应用:仅将此模式用于对延迟敏感或业务关键型操作。对于背景工作负载,日志错误并在更高级别重试,延迟时间更长。