
AWS入門 初心者が覚えておくべきAWSの基本
分散アプリケーションでは、個々のサービスが複雑に絡み合っています。それゆえ、1つのサービスに問題が発生すると他サービスにも影響が出てしまうということが少なくありません。Amazon SQSはサービス間をゆるやかに「つなぐ」ことで影響範囲を限定し、開発コストの大幅な削減が期待できるサービスです。
今回は、Amazon SQSの特徴と基本的な仕組み、活用方法などをご紹介します。
Amazon SQS(Simple Queue Service)は、AWSが提供する「サーバーレスでキューイングを実現できる」サービスです。Amazon SQSを理解するためにはまず「キューイング」の概念を知る必要があります。「キューイング」とは日本語にすると「待ち行列」という意味です。人気のお店で行列ができるのと同じで、システム用語では「処理の順番待ち」という意味で使われます。
さて、このキューイングがどういう効果をもたらすかというと、「分散アプリケーション上で非同期に処理が進められる」ようになるのです。通常、システム間での処理連携(メッセージング)は同期的に行われます。しかし、同期メッセージングでは受信側の状態に問題があった場合、送信側はメッセージを送信できません。すると、送信側のシステムが処理できないままスタック(停止)してしまいます。
そこで登場するのがキューイングです。キューイングを使えば、送信側は受信側の状態に左右されずメッセージを投げて自分の仕事に戻ることができます。言葉だけでは理解が難しいので下図をご覧ください。
メッセージキューイングを使わない場合と使う場合
例えるならば、ハンバーガーショップの店員さんがレジで注文を受け、別のスタッフがハンバーガーを作っているのと同じイメージです。一人で注文から調理まで担当していたらお店の効率は上がりません。
このように、お互いの状態の影響を受けないようにシステム間を疎結合にすることで、システムの可用性を高めることができるのです。ほかにもキューイングのサービスとしては「Azure Queue Storage」「Google Cloud Tasks (GAE Task Queue)」などでも提供されていますが、Amazon SQSはほかのAWSサービスと容易に連携でき、高度な処理も実現できるところが大きな特徴といえるでしょう。
次に、Amazon SQSの特徴を簡単に順にみていきましょう。
さきほど述べたように、キューイングを利用することでシステム間を疎結合にでき、分散アプリケーションの拡張性、可用性を大幅に改善できます。サーバーレスで分散アプリケーションをつなぐため、高い負荷がかかった場合でも柔軟なスケールができます。また、テストや保守の面でも大幅なコスト削減が期待できるでしょう。
キューイングに関することはすべてAmazon SQSにお任せしてしまうことで、負荷やメンテナンスのことを気にする必要はありません。技術者はサービスの充実に注力できます。
キューイングで送信されたキューは複数のサーバーに分散格納され、そのうちの1つが取り出されて処理されます。これにより、キューが紛失することなく確実にメッセージングできます。
利用するにあたって前払い料金や最低料金は発生しません。使った分だけ課金される従量課金制なので、スタートアップ企業や小規模から始めたい場合でも安心して利用できます。
Amazon SQSのキューイングで送受信されるメッセージはAWS Key Management Service (KMS)によって暗号化されます。
Amazon SQSを理解するうえで重要な用語をみていきましょう。Amazon SQSは基本的に「プロデューサー」と「コンシューマー」の関係で成り立っています。
キューにメッセージをプロデュース(提供)する側のアプリケーション
キューに溜まったメッセージをコンシューム(消費)する側のアプリケーション
そして、キューを呼び出すことを「ポーリング」と呼びます。
Amazon SQSではキューイングされたキューの処理を以下の流れで行います。
ポーリングでキューを取得して処理し、処理されたキューは一定時間後に削除されます。キューには2つのタイプがあります。
キューには「スタンダードキュー」と「FIFOキュー」という2つのタイプがあります。
スタンダードキューは確実にメッセージを届けるため、複製されたメッセージがランダムに分散・配置されます。そして、その分散されたキューは時系列に関係なくポーリングされることになります。どういうことかというと「1、2、3」という処理をキューしても、処理される順番は「2、3、1」かもしれないし「1、3、2」かもしれないということです。スタンダードキューでは処理の順番を保証しません。
標準キューの処理順序
スタンダードキューは「順序はどうあれ、最終的に処理されていればOK」な処理に向いています。たとえば、画像の圧縮処理、データのバックアップ処理などがこれに該当するでしょう。また、留意しなければならないのは、Amazon SQSでは「最低1回以上の配信」が保証されている点です。つまり、一度処理されたメッセージが再度配信される可能性がある、ということです。このため、アプリケーション側では重複処理を行わない、もしくは重複処理しても問題ない設計にしておく必要があります。
スタンダードキューに対して、先入れ先出し方式でキューを処理できるのが「FIFOキュー」です。FIFOは"First In, First Out"の略で、「先入れ先出し」を意味します。FIFOキューはまさに「1、2、3」という処理をキューすれば、「1、2、3」という順番で処理してくれます。
FIFOキューの処理順序
両者にはそれぞれ特徴がありますが、Amazon SQS上での違いをまとめたのが以下です。
スタンダードキュートFIFOキューの特徴と関係性
なお、Amazon SQSの料金の詳細については、AWS公式ページでご確認ください。
Amazon SQS の料金(AWS公式ページ)
https://aws.amazon.com/jp/sqs/pricing/
Amazon SQSのキューイングでは、一度ポーリングされたキューは即座には削除されず、一定期間保持されます。これを「可視性タイムアウト」と呼びます。なぜ可視性タイムアウトが必要なのかというと、分散アプリケーションでは、ネットワーク接続やコンシューマーに問題があった場合に実際に受信されたかを確認する方法がないためです。
そのため、Amazon SQS自身が処理されたキューを自動で削除するという機能は持っていません。キューを処理したコンシューマーがキューの削除依頼を出すことで、キューは初めて削除されます。可用性タイムアウトはデフォルトで30秒ですが、0秒~12時間の間で設定できます。
メッセージ(キュー)のライフサイクル概念
Eコマースでは受注してから各種在庫処理が行われます。この処理をSQSで分散して処理することにより、大規模なEコマースアプリケーションの安定した運用を支援します。
チャットサービスというとリアルタイム性ばかりが注目されがちですが、チャットで交わされた会話をいつどのように保存するか、という課題もあります。そこで、Amazon SQSを利用して、チャットシステムのバックグラウンドで会話の内容をデータベースに保存する、といった用途が考えられます。
通常、Amazon SQSではプロデューサーとコンシューマーは1対1の関係でつながっていますが、これにpub/sub型(送信型と受信側の非同期型)のメッセージングサービスであるAmazon SNS(Simple Notification Service)を組み合わせることで、1対Nの関係性でメッセージを一斉に送受信するシステムが構築可能です。メッセージングの並列処理を行いたいときにはぜひ組み合わせたい利用方法です。
システム構築では重たい処理をいかに高速に処理するかがいつも課題になります。画像の加工処理は重たい処理の代表ですが、これをAmazon SQSとその他のAWSサービスを連携させることで実現可能です。たとえば、画像データ自体はAWSの「S3」に配置し、「Lambda」を使って画像処理を行う、といった方法で分散処理を行います。これらをAmazon SQSでつないでいきます。
Amazon SQSは、分散アプリケーションをキューイングによってゆるやかにつなぐサービスです。アプリケーション相互の影響度を下げることは、システムの運用コストや開発コストにも大きく影響する要素です。導入も簡単ですぐにコードを書いて試せるので、検討してみてはいかがでしょうか。
移行準備段階で知っておくべきAmazon Web Servicesの
サービスを学び、具体的にクラウド検討を考える!