非同期処理 - ユーザー画面はレスポンス良くしたい(3)
Amazon EC2 API
ポーリング(pull型)のAPIとして、DescribeInstancesをご紹介します。
EC2インスタンスを作成するときには、RunInstancesというAPIを使いますが、このAPIは、EC2インスタンスの作成処理の開始を行うだけで、EC2インスタンスIDを返却してすぐに終了します。その後、EC2インスタンスの作成状況は、DescribeInstances というAPIを利用して確認します。
AWS CLIでのAPI利用例は下記の通りです。
# run-instances コマンドでインスタンスの作成指示
$ aws ec2 run-instances --image-id ami-xxxxxxxx .....
# その後の作成ステータスはdescribe-instancesで確認
$ aws ec2 describe-instances --instance-ids ${instance-id}
参考
なお、AWS CLIの場合、waitというコマンドを利用すれば、次の例のようにポーリングのループ処理を記述する必要がありません。
#!/bin/sh
# run-instances コマンドでインスタンスの作成指示
aws ec2 run-instances --image-id ami-xxxxxxxx .....
# waitでインスタンスのステータスを確認
aws ec2 wait instance-running --instance-ids ${instance-id}
# EC2インスタンスがrunning状態になったときに次の行が実行されます
(後続の処理)
Amazon CloudWatch Events
イベント(push型)の例として、Amazon CloudWatch Eventsがあります。
Amazon CloudWatch Eventsでは、ターゲットとしてLambdaファンクションやSNSトピックなどを設定し、AWS環境の状態変化だけでなく、アプリケーション独自のイベント通知をも可能にしています。
Amazon CloudWatch Eventsドキュメンテーションのチュートリアルでは、ターゲットとしてLambdaファンクションを設定し、インスタンスの状態変化イベントが起きるたびに、ログ出力する例を掲載しています。
pull型の非同期処理を実装する場合には従来、こうしたイベント通知処理全体を、アプリケーション開発者が実装しなければなりませんでした。
Amazon CloudWatch Eventsの登場により、アプリケーション開発者は、簡単にイベント通知をアプリケーションに実装することができるようになり、よりビジネスロジックに集中することができるようになりました。
非同期処理の利点
ここまで非同期処理とは何か、具体的な実装にあたりどのような手法があるのか説明してきました。また、利用者視点で、処理をブロックされずに済むという利点があることもご紹介しました。実は、バックエンドの実現においても次のような利点があります。
- Webフロントエンド処理を停止させることなく、実際の処理を行うバックエンド側のメンテナンスをスケジュールすることが可能
- Webフロントエンド層では、少ないサーバーキャパシティで多くのリクエストを処理可能(リクエストの受付だけを実装すればよいため、処理が軽くなる)
- リクエストの処理順序やリトライ等の制御が可能
バックエンド側のメンテナンスが可能な点にご着目ください。
同期処理の場合、一つの処理に関係するコンポーネント全体を一度にメンテナンスする必要があるので、明示的にダウンタイムを設け、ユーザーの利用を停止させなければなりません。
非同期処理の場合は、中間にリクエストキューを挟むことで、「リクエストの受付処理(ユーザーへのインタラクティブな処理)」と「実際の更新処理」を分離し、コンポーネント間の依存関係を疎結合にすることができます。そのため、各コンポーネントを別々にメンテナンスしやすい構成をとることができます。
本稿では扱いませんが、Immutable Infrastructureや、Blue-Green Deploymentを実現するためにも、こうした非同期処理の実装が非常に重要になってきます。
中締め
本稿では、CAP定理を取り上げ、非同期処理(Asynchronous process)についてご紹介しました。
リクエストキューとして、Amazon SQSを便利にご利用いただけること、また、非同期処理を実装した場合の状態確認方法として、ポーリング(push型)とイベント(pull型)があり、基本となるポーリング(push型)のDescribeInstances API、ループ処理の記述が不要なwaitコマンド、ユーザーが手間をかけずにpush型のイベント通知を可能とするCloudWatch Eventsなどについてもご説明しました。
次回以降、以下の3つについてご紹介します。
- リトライ(Retry with Exponential Backoff and jitter)
- 結果整合性(Eventual Consistency)
- 冪(べき)等性(Idempotency)
アマゾン ウェブ サービス ジャパン株式会社ではクラウドサポートエンジニアを絶賛募集中です。誰よりもAWSの仕組みを深く知り、また実際のAWSのユースケースを幅広く知ることができるとても刺激的な仕事です。
AWSクラウドサポートエンジニアに興味を持ってくださった方は、Webサイトからオープンハウスへの参加登録をお願いいたします。
