AWSでレジリエントな分散システムを構築するためのデザインパターン

AWSでレジリエントな分散システムを構築するためのデザインパターン

本記事では、分散システム構築における課題と、その解決策として注目されているレジリエンスについて解説します。特に、AWS上で高い可用性を実現するための設計パターンについて、具体的な事例を交えながら解説していきます。

分散システムは、複数のサーバーやサービスなどのコンポーネントをネットワークで相互接続することで構成されます。このシステムは、パフォーマンス向上やリソースの効率的な活用といったメリットがある一方で、複雑性が増すという課題も抱えています。

分散システムは、それぞれのコンポーネントが障害点となり得るため、障害発生時にシステム全体が停止してしまうリスクがあります。そこで重要になるのが、レジリエンスです。レジリエンスとは、システムが障害に耐え、迅速に復旧する能力のことです。

分散システムにおけるレジリエンス

AWSにおけるレジリエンスとは、ワークロードが障害に対応し、障害から迅速に復旧する能力を指します。多くのコンピューターが、多くのネットワークを介して通信する複雑な分散システムでは、全ての障害を予測することは難しいと言えます。

そのため、障害が発生した際に、どのように復旧させるか、どのように回復させるか、レジリエンスの設計が重要になります。AWSにおけるシステム構築では、「Everything fails, all the time.(あらゆるものは、常に壊れる可能性がある)」という考え方のもと、レジリエンスを考慮した設計を行うことが重要です。

レジリエンス向上のための具体的な設計パターン

それでは、分散システムにおけるレジリエンス向上のための具体的な設計パターンを見ていきましょう。今回は、架空のECサイト「Unicorn Retail」を例に、3つの設計パターンをご紹介します。

  1. グレースフル・デグラデーション
    日本語では「優雅な劣化」という言葉になりますが、これは一部のコンポーネントが停止したとしても、サービス全体としては停止させずに、機能制限(デグレード)しながらサービスを提供し続ける能力のことです。
    例えば、ECサイトでレコメンドサービスだけに障害が発生した場合、ブラウザ側ではおすすめ情報といった情報をバックエンドから取得できなくなります。
    しかし、この場合でも、ユーザーは引き続き商品の閲覧や購入という最も重要な機能は利用可能です。このように、一部機能の停止は許容しつつも、コアとなる機能は提供し続けることで、ユーザー体験を維持することがグレースフル・デグラデーションの考え方です。
  2. リトライとエクスポネンシャル・バックオフ
    一時的なエラーへの対応力を強化する手段として、リトライとエクスポネンシャル・バックオフがあります。
    サービスAからサービスBにリクエストを送信する際に、一度エラーが返ってきたとしても自動的にリトライを実行することで、一時的な障害であれば自動的に復旧できることがあります。
    そして、このリトライの待機時間を少しずつ伸ばしていく考え方がエクスポネンシャル・バックオフです。例えば、1回目のリトライは1秒後、2回目は2秒後、3回目は4秒後というように、指数関数的にリトライの待機時間を伸ばしていくことで、サービスBに対する負荷を軽減し、障害の拡大を防ぐ効果があります。
  3. サーキットブレーカー
    仮にサービスBから継続的にエラーが返ってくるような場合、サービスBに問題が発生している可能性があります。
    このような状況では、サービスBへの呼び出しを遮断し、即座にエラーを返すようにすることで、サービスAへの影響を最小限に抑えることができます。これがサーキットブレーカーの考え方です。
    通常、サーキットブレーカーはクローズドというステータスになっており、サービスAからのリクエストを自動的にサービスBに転送します。
    しかし、サービスBからのエラー応答が増加し、設定した閾値を超えると、サーキットブレーカーのステータスはオープンという状態になり、即座にエラーを返すようになります。
    一定時間経過後、サーキットブレーカーのステータスはハーフオープンという状態に移行し、一部のリクエストのみをサービスBに転送するようになります。この際、サービスBからの応答が正常であれば、サーキットブレーカーはクローズド状態に戻り、以降は通常通りサービスAからのリクエストをサービスBに転送します。

まとめ

本記事では、分散システムの構築におけるレジリエンス向上の重要性と、具体的な設計パターンについて解説しました。

  • 分散システムは、サービス分割によって可用性を高めることができますが、複雑性も増大するため、サービス間の依存関係を意識した設計が重要です。
  • サービス分割による複雑性増加に対処するため、グレースフル・デグラデーション、リトライとエクスポネンシャル・バックオフ、サーキットブレーカーといった設計パターンを導入することで、システム全体のレジリエンスを向上させることができます。

分散システム構築は複雑な作業ですが、AWS Well-Architected Frameworkなどを参考に、適切な設計と実装を行うことで、信頼性の高いシステムを構築することが可能です。
AWSモダナイズ・スモールスタート開発支援基幹業務システムのUI.UX刷新はお気軽にお問い合わせください。