AWS でのフォールトトレラントかつ耐障害性のあるアプリケーション設計
AWS でのアプリケーション開発
Ricardo Sueiras
Principal Technologist
一時的な障害
- 代表的な障害モードを理解しましょう。
- 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
タイムアウト
- 代表的な障害モードを理解しましょう。
- 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
- タイムアウト:外部サービスの応答に時間がかかりすぎる場合に発生します。
永続的なエラー
- 代表的な障害モードを理解しましょう。
- 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
- タイムアウト:外部サービスの応答に時間がかかりすぎる場合に発生します。
- 永続的なエラー:リクエスト自体に問題があり、リトライしても解決しません。
API 制限
- 代表的な障害モードを理解しましょう。
- 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
- タイムアウト:外部サービスの応答に時間がかかりすぎる場合に発生します。
- 永続的なエラー:リクエスト自体に問題があり、リトライしても解決しません。
- API レート制限:リクエスト過多の場合、HTTP 429 Too Many Requests が返ります。
リトライ戦略
- 分散システムの障害は一時的なものが多いです。
- リトライすると成功することがよくあります。
- リトライロジックは慎重に実装しましょう。無条件なリトライは逆効果になることがあります。
- 指数バックオフ:リトライのたびに待機時間を増やします。
- ジッター:ランダム性を加えてリトライのスパイクを防ぎます。
- リトライ上限:無限ループを防止します。
AWS SDK のネイティブ機能
- AWS SDK はリトライロジックを自動で処理します。
- 組み込みのリトライには指数バックオフとジッターが含まれます。
- 失敗またはスロットリングされたリクエストは、待機時間を延ばしながら再試行されます。
- 手動でエラー処理を記述する量を削減できます。
リトライロジックの管理
- リトライロジックが常に有効とは限りません。
- HTTP 4xx エラー:サーバーがリクエストを受け取った上で拒否しています。
- 非冪等なリクエスト:リトライにより重複や不整合が発生することがあります。
タイムアウトの管理
- 制限なしのリトライは、負荷時に問題を悪化させることがあります。
- リトライとタイムアウトを組み合わせましょう。
- タイムアウトは、レスポンスを待つ最大時間を設定します。
- 外部サービスへのすべての呼び出しにタイムアウトを設けましょう。
サーキットブレーカー
- サービスが繰り返し失敗する場合、リトライだけでは不十分です。
- リクエストを送り続けると、障害中のサービスに過負荷をかけます。
- サーキットブレーカーパターンは、不健全な依存先へのリクエストを一時的に停止します。
- クローズ状態:リクエストが通常通り流れます。
サーキットブレーカー
- 障害がしきい値を超えると、サーキットがオープン状態になります。
- 以降のリクエストはブロックされます。
サーキットブレーカー
- クールダウン後、サーキットはハーフオープン状態に移行し、回復をテストします。
- サービスが正常に応答すれば、通常の動作が再開されます。
- まだ失敗している場合、サーキットはオープン状態を維持します。
- サーキットブレーカーはアプリケーションレベルで実装しましょう。
デッドレターキュー
- 繰り返し失敗するメッセージはシステムをブロックすることがあります。
- メインの処理フローから切り離しましょう。
- 失敗したメッセージはデッドレターキューに移動されます。
- 耐障害性のあるアプリケーション構築における重要な要素です。
- ただし、トレードオフを十分に理解しましょう。
AWS API 制限
- AWS サービスは API を通じて操作します。
- 各サービスは独自の API レート制限を定義しています。
- 制限を超えるとスロットリング(HTTP 429 Too Many Requests)が発生します。
- スロットリングを適切に処理できるアプリケーション設計が必要です。
サードパーティサービスとの統合
- サードパーティサービスは不確実性をもたらします。
- そのパフォーマンスや可用性をコントロールすることはできません。
- タイムアウトを設定して長時間の待機を防ぎましょう。
- 一時的な問題にはバックオフ付きリトライを使いましょう。
- 依存関係を分離して影響範囲を限定しましょう。
サードパーティとの統合
- 同期通信から非同期通信への切り替えを検討しましょう。
- 外部サービスが遅延していても、自システムの処理を継続できます。
練習しましょう!
AWS でのアプリケーション開発
Preparing Video For Download...