AWS でのフォールトトレラントかつ耐障害性のあるアプリケーション設計

AWS でのアプリケーション開発

Ricardo Sueiras

Principal Technologist

耐障害性のある設計

耐障害性の構築

AWS でのアプリケーション開発

すべてはいつか失敗する

AWS でのアプリケーション開発

一時的な障害

 

一時的な障害

  • 代表的な障害モードを理解しましょう。
  • 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
AWS でのアプリケーション開発

タイムアウト

 

タイムアウト

  • 代表的な障害モードを理解しましょう。
  • 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
  • タイムアウト:外部サービスの応答に時間がかかりすぎる場合に発生します。
AWS でのアプリケーション開発

永続的なエラー

 

永続的なエラー

  • 代表的な障害モードを理解しましょう。
  • 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
  • タイムアウト:外部サービスの応答に時間がかかりすぎる場合に発生します。
  • 永続的なエラー:リクエスト自体に問題があり、リトライしても解決しません。
AWS でのアプリケーション開発

API 制限

 

API 制限

  • 代表的な障害モードを理解しましょう。
  • 一時的なエラーは自然に解消されるため、通常はリトライが有効です。
  • タイムアウト:外部サービスの応答に時間がかかりすぎる場合に発生します。
  • 永続的なエラー:リクエスト自体に問題があり、リトライしても解決しません。
  • API レート制限:リクエスト過多の場合、HTTP 429 Too Many Requests が返ります。
AWS でのアプリケーション開発

リトライ戦略

  • 分散システムの障害は一時的なものが多いです。
  • リトライすると成功することがよくあります。
  • リトライロジックは慎重に実装しましょう。無条件なリトライは逆効果になることがあります。
  • 指数バックオフ:リトライのたびに待機時間を増やします。
  • ジッター:ランダム性を加えてリトライのスパイクを防ぎます。
  • リトライ上限:無限ループを防止します。

 

リトライ戦略

AWS でのアプリケーション開発

AWS SDK のネイティブ機能

  • AWS SDK はリトライロジックを自動で処理します。
  • 組み込みのリトライには指数バックオフとジッターが含まれます。
  • 失敗またはスロットリングされたリクエストは、待機時間を延ばしながら再試行されます。
  • 手動でエラー処理を記述する量を削減できます。

 

SDK の機能

AWS でのアプリケーション開発

リトライロジックの管理

 

リトライしない

  • リトライロジックが常に有効とは限りません。
  • HTTP 4xx エラー:サーバーがリクエストを受け取った上で拒否しています。
  • 非冪等なリクエスト:リトライにより重複や不整合が発生することがあります。
AWS でのアプリケーション開発

タイムアウトの管理

 

タイムアウト管理

  • 制限なしのリトライは、負荷時に問題を悪化させることがあります。
  • リトライとタイムアウトを組み合わせましょう。
  • タイムアウトは、レスポンスを待つ最大時間を設定します。
  • 外部サービスへのすべての呼び出しにタイムアウトを設けましょう。
AWS でのアプリケーション開発

サーキットブレーカー

  • サービスが繰り返し失敗する場合、リトライだけでは不十分です。
  • リクエストを送り続けると、障害中のサービスに過負荷をかけます。
  • サーキットブレーカーパターンは、不健全な依存先へのリクエストを一時的に停止します。
  • クローズ状態:リクエストが通常通り流れます。

 

サーキットブレーカー

AWS でのアプリケーション開発

サーキットブレーカー

  • 障害がしきい値を超えると、サーキットがオープン状態になります。
  • 以降のリクエストはブロックされます。

 

サーキットブレーカー

AWS でのアプリケーション開発

サーキットブレーカー

  • クールダウン後、サーキットはハーフオープン状態に移行し、回復をテストします。
  • サービスが正常に応答すれば、通常の動作が再開されます。
  • まだ失敗している場合、サーキットはオープン状態を維持します。
  • サーキットブレーカーはアプリケーションレベルで実装しましょう。

 

サーキットブレーカー

AWS でのアプリケーション開発

デッドレターキュー

 

デッドレターキュー

  • 繰り返し失敗するメッセージはシステムをブロックすることがあります。
  • メインの処理フローから切り離しましょう。
  • 失敗したメッセージはデッドレターキューに移動されます。
  • 耐障害性のあるアプリケーション構築における重要な要素です。
  • ただし、トレードオフを十分に理解しましょう。
AWS でのアプリケーション開発

AWS API 制限

 

API 制限

  • AWS サービスは API を通じて操作します。
  • 各サービスは独自の API レート制限を定義しています。
  • 制限を超えるとスロットリング(HTTP 429 Too Many Requests)が発生します。
  • スロットリングを適切に処理できるアプリケーション設計が必要です。
AWS でのアプリケーション開発

サードパーティサービスとの統合

  • サードパーティサービスは不確実性をもたらします。
  • そのパフォーマンスや可用性をコントロールすることはできません。
  • タイムアウトを設定して長時間の待機を防ぎましょう。
  • 一時的な問題にはバックオフ付きリトライを使いましょう。
  • 依存関係を分離して影響範囲を限定しましょう。

 

サードパーティとの連携

AWS でのアプリケーション開発

サードパーティとの統合

  • 同期通信から非同期通信への切り替えを検討しましょう。
  • 外部サービスが遅延していても、自システムの処理を継続できます。

 

サードパーティの管理

AWS でのアプリケーション開発

練習しましょう!

AWS でのアプリケーション開発

Preparing Video For Download...