ネットワークジッターまたはサーバーの異常が発生するシナリオでのインタラクションの信頼性を確保するために、Simple Message Queue (SMQ、旧称 MNS) クライアントは、プロデューサーとコンシューマーの両方に対処する信頼性ポリシーを実装しています。
プロデューサー: リトライメカニズム
例外の種類とリトライトリガー
例外の種類: クライアント例外 (
MNS ClientException。ネットワークタイムアウトやレート制限エラーなど) とサーバー例外 (ServerException) を識別して分類します。リトライ可能なエラー (エラーコード 5xx やネットワークジッターなど) とリトライ不可能なエラー (リソースが存在しないQueueNotExistなど) を区別します。必要に応じたクライアントリトライ: 必要に応じてメッセージを再送信するために、ビジネス要件に基づいてビジネスコード内にリトライロジックを作成できます。
バックオフポリシー
ランダムジッターポリシーと組み合わせた指数バックオフポリシー (例: 1 秒から開始し、60 秒に制限) を実装することをお勧めします。このようにして、過剰なクラスタレベルのリトライを回避できます。
コンシューマー: リトライメカニズム
プロデューサー: 自動リトライ
消費の失敗時 (メッセージが明示的に承認されない、または消費がタイムアウトするなど) に、SMQ は、クライアントが新しいメッセージをプルするときに、キューの 可視性タイムアウト期間 に基づいてメッセージを自動的に再配信します。
コンシューマー: 冪等性設計
ビジネスロジックを本質的に冪等になるように設計するか (一意のデータベースキーによる重複排除など)、一意のメッセージ識別子
MessageIdとサービスステータスを組み合わせてメッセージが消費されたかどうかを確認します。
例外処理
メッセージ消費ロジックで例外が発生した場合は、確認応答 (ACK) メッセージを送信しないでください。代わりに、SMQ がメッセージを正常に消費するまで再配信できるようにします。正常に消費された時点で、
DeleteMessage操作を呼び出してメッセージを削除できます。
参照
Java のサンプルコードについては、「サンプルコードを使用してメッセージを受信する」をご参照ください。