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 ラベルが付いています。これはサーバーが過負荷になり、負荷を分散していることを示します。
InterruptedDueToOverloadRetryableErrorエラーは、クラスターの安定性を保護するために操作をサーバーが終了したことを意味します。このエラーは再試行可能なものとして指定されておらず、 ラベルが含まれていません。操作を再試行する場合は、過負荷に寄与しないように、それが冪等であることを確認し、再試行する前に待機してください。再試行ロジックで指数バックオフとJWTを使用します。詳細については、「 過負荷エラーの処理 」を参照してください。
バックプレッシャー対応クライアント ライブラリのバージョン
バックプレッシャー対応ドライバーとその他のクライアントライブラリは、SystemOverloadedError ラベルで過負荷エラーを自動的に認識し、過負荷のシグナルとして扱います。エラーに RetryableError ラベルなど、再試行を伴う ラベル がある場合、バックプレッシャー対応クライアントライブラリは指数バックオフとジャーナルを使用して操作を自動的に再試行します。
次の表は、バックプレッシャーに対応するクライアントライブラリの初期バージョンを示しています。
クライアント ライブラリ | バックプレッシャーに対応する以前のバージョン |
|---|---|
C ドライバー | 2.3 |
C++ ドライバー | 4.3 |
.NET/C# ドライバー | 3.8 |
Go Driver | 2.6 |
Java Sync Driver | 5.7 |
Java Reactive Streams ドライバー | 5.7 |
Kotlin コルーチン ドライバー | 5.7 |
Kotlin Sync ドライバー | 5.7 |
Node.js ドライバー | 7.2 |
PHP ライブラリ | 2.3 |
PyMongo | 4.17 |
Scala ドライバー | 5.7 |
バックプレッシャー対応のクライアントライブラリを使用している場合、IWM ポリシーからの過負荷エラーを処理するために追加の再試行ロジックを実装する必要はありません。バックプレッシャー対応のクライアントライブラリを使用していない場合は、「 過負荷エラーのガイダンス」を参照してください。
過負荷エラーの処理
バックプレッシャー対応のクライアントライブラリを使用していない場合は、過負荷エラーを処理するためにエラー検出および再試行ロジックを実装する方法の例については、次の手順を参照してください。
過負荷エラーを検出し、指数バックオフで再試行するためのユーティリティを実装するには、次の手順に従います。
安全な過負荷再試行に関するガイドライン
過負荷エラーで失敗した操作を再試行する場合は、次のガイドラインを使用して過負荷にならないようにし、再試行が成功する可能性を増やします。
2再試行を制限します。 1 回の操作ごとに最大 の再試行を使用します。値を高くするとエラー率は減りますが、過負荷時にサーバーの負荷が増加しますが、再試行の頻度が少ないとサーバーの負荷は軽減されますが、エラー率は増加します。
選択的に適用します: このパターンは、レイテンシの影響を受けやすい操作またはビジネスに重要な操作でのみ使用してください。バックグラウンド ワークロードの場合、エラーをログ、より高いレベルで再試行し、遅延を増やします。