クラウド・ネイティブのお作法(1)「非同期処理」~24時間365日ダウンタイムがゼロのシステムのために必要なこと
AWSの深いところ見せちゃいます! by AWSクラウドサポートエンジニア 第6回
こんにちは。アマゾンウェブサービス クラウドサポートエンジニアの小武です。Amazon EC2、Amazon RDS、Amazon Redshiftなどのサービスの他、AWSを支える裏側の技術にとても興味があり、日々Dive Deepしています。本連載ではAWSサポートのエンジニアがそれぞれ「今一番AWSユーザーに伝えたいこと」を連載の形でお届けしています。
ここまでの連載で、AWSバックボーンネットワークの裏側、EC2イベントへの対応やDesign for Failureについてお話してきました。
私の担当回では、AWSという巨大な分散システムを支える技術要素のうち、非常に重要なアーキテクチャ設計、プログラミング技術のいくつかについて見ていきたいと思います。これらは、AWSの内部を支える技術でもありますが、皆さんのアプリケーションをダウンタイムゼロのシステムに近づけるための基礎技術、クラウド・ネイティブなアプリケーションを構築する基礎的なテクニックのヒントにもなると思います。
具体的には、下記の4つをご紹介します。
- 非同期処理(Asynchronous process)
- リトライ(Retry with Exponential Backoff and jitter)
- 結果整合性(Eventual Consistency)
- 冪(べき)等性(Idempotency)
本記事では、非同期処理について解説します。
24時間365日計画停止もダウンタイムもないシステムを作るために
何かプログラムを作成しようと思ったとき、まずは、「そのプログラムで実現したいこと(要件)」を機能として実装し、とにかく「動くもの」を作りますよね。Webサービスであれば、1台のサーバー上に1つのデータベース、1つのWebサイトをもったシステムをモックアップとして作成します。
このモックアップが、どんな負荷にも耐え、物理的な故障が起きても自動で復旧することができれば幸せですが、サーバーやネットワークはダウンすることがあり、現実的に本番サービスとしてリリースする前には、システムを安定稼働させるために、さまざまな制約や単一障害点(Single Point of Failure)がないかなどを考慮しなければなりません。
インフラ的な視点から、Webサービスを構成するコンポーネントごとの冗長性を持たせるために、負荷分散装置を設ける、Webサーバーを複数立てる、データベースのレプリカを作成するなどの対策を講じることは可能です。しかし、それだけでダウンタイムゼロのシステムが実現できるわけではありません。ダウンタイムゼロのシステムを作成するには、アプリケーションプログラム側で、これらのインフラを適切にハンドリングできるような設計にしておく必要があります。
例えば、可用性を向上させようとして、図1の「Production#1」のように、単純にApp+DBの組をそのまま複数持たせてみると、それぞれのアプリケーションは自身に対応するデータベースにのみデータを書き込むことになるため、当然ながら、データベース間のデータはバラバラで同期されません。
そこで、「Production#2」のように、データベースのレプリケーションを加味して構築してみます。これはマスターデータベースがダウンしても、他データベースが処理を引き継げる(フェールオーバー)ので、一見、完璧なようにも見えます。しかし、厳密に言えば、フェールオーバー時にわずかなダウンタイムが発生し、サーバー間の通信がダウンする可能性があります。さて、こうしたタイミングではアプリケーションはどう振舞えばいいのでしょう。
この記事は参考になりましたか?
- AWSの深いところ見せちゃいます! by AWSクラウドサポートエンジニア連載記事一覧
-
- クラウド・ネイティブのお作法(2)「リトライ」~効率的なリトライ手法「Exponentia...
- クラウド・ネイティブのお作法(1)「非同期処理」~24時間365日ダウンタイムがゼロのシス...
- Amazon EC2のイベント対応を楽にするためのアイデアと「Design for Fai...
- この記事の著者
-
小武 三博(アマゾン ウェブ サービス ジャパン株式会社)(コタケ ミツヒロ)
AWSクラウドサポートエンジニア。国内SIerにて業務システム、障害監視システムの設計・開発に携わる。その後、国際税務コンサルに転職し、社内ITとしてデータセンター運用、オフィスネットワーク設計構築、セキュリティ監査対応、税務システム開発などに携わる。アプリケーションからインフラまで、また、Lin...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
