はじめに
今回は、AWS試験で頻出のAmazon SQSについて、解説しようと思います。
正直、初めてこのサービスを学んだ時に少し理解がしづらかった記憶があります。。
「並列処理するときに使える?」ぐらいのざっくりした認識でしたが、
勉強を進めていくうちに、サービスの全体像が見えてきたので、このブログでまとめたいと思います!
メッセージングサービスについて知ろう
Amazon SQSは大きなくくりで言うと、メッセージングサービスとなります。
Amazon SQSについて説明する前に、ここではメッセージングサービスについて知っておきましょう!
異なるソフトウェアの間でデータ(メッセージ)を効率的かつ確実に転送するためのソフトウェアやサービスを指します。
直接サーバー同士をつなぎ、ネットワークで連絡を行うこともできますが、メッセージングサービスを使うことでやり取りを非同期にすることができ、障害などのトラブルを回避することができます。
非同期通信を採用することでアプリケーション同士のつながり度合を低くすることを、「疎結合化(デカップリング)」といいます。
メッセージングサービスがどのような役割のものか分かったら、続いてAmazon SQSの説明に移ります!
Amazon SQSとは?
ざっくり解説すると…
・フルマネージド型のメッセージキューイングサービス
・ソフトウェア間で直接データを渡すのではなく、キューというデーター構造に格納することで通信を行う
と思いますよね? でも、ご安心ください!もう少しシンプルに解説していきます。
簡単に言うと、
Amazon SQSはサービス間のデータのやり取りをゆるやかに「つなぐ」ことで、開発コストの大幅な削減が期待できたり、耐障害性が高くなるサービスです。
例えば、EC2インスタンスからデータを大量にDynamoDBに送るシーンがあったとします。
直接送るとなると、DynamoDBには高負荷がかかってしまったり、何かエラーが起きた時にデータが損失してしまう単一障害点となる危険があります。
Amazon SQSでは、
メッセージ(データ)を送る側を ”プロデューサー”
メッセージ(データ)を受け取る側を”コンシューマー”と呼びます。
ここでプロデューサーとコンシュマーの間に、Amzon SQSを導入することで、密接なアプリーケーション同士が切り離されて、システム全体の耐障害性が向上します。
ここまででピンと来なかった方は、行列のできる料理屋さんをイメージしてみましょう。
人気店のコックさんが注文を受け、自分の料理までするのは効率が悪いですよね。コックさん一人に負荷がかかってしまいます。
そこで、別の店員が注文をとるようにすることで、効率的にお店をまわすことができます。
キューとは?
Amazon SQSでメッセージを溜め込む場所をキューと言います。
メッセージキューイングとは、システムの間で送信するメッセージ(データ)を一時的にキューに格納して、そこから順次処理をしていくという機能です。
コンシューマーが側で準備ができると、ポーリングによってSQSからデータを読み込みます。
ポーリングとは、定期的な問合せのことです。
郵便屋さんが、ポストに手紙が投函されてないか定期的に巡回して、手紙が投函されていたら回収しますよね。ポーリングも同様で、データが溜まってないかを定期的に問い合わせして、溜まっていたら読み込むという仕組みになっています。
ポーリングの種類
ポーリング方法にはショートポーリングとロングポーリングの2種類があります。
ここで少し整理しておきましょう!
①ショートポーリング
Amazon SQSでのデフォルトの設定であり、
メッセージ受信待機時間を0秒にすると、ショートポーリングが適用されます。
キュー内のメッセージ有無に関わらず、キューに対してメッセージの取得要求を送信します。
そのため、キューは空のレスポンスを返すこともあります。
ポーリングは、リクエスト回数に応じて料金が発生します。
そのため、空のレスポンスを受け取った場合でも料金は発生します。
コストパフォーマンス効率は少し悪くなります。
②ロングポーリング
メッセージ受信待機時間を0秒以上にするとロングポーリングになります。
待機時間は、0秒〜20秒までの間で設定することが出来ます。
待ち時間を増やせば増やすほど、リクエスト回数を減らせるので、料金も安くなってきます。
そのため、要件によって適切なポーリング間隔を設定することでコスト最適化が図れることになります。
AWSでは、ロングポーリングを設定することを推奨しています。
設定画面▼
キューの種類
まずはじめに、キューとはどういう機能だったかを復習しましょう。
キューとは、Amazon SQSでメッセージを一時的に溜め込む場所でしたね!
そんなキューには以下の2種類があります。
①標準キュー
②FIFOキュー
それぞれの特徴をみていきましょう。
①標準キュー
特徴としては、メッセージは少なくとも1回は確実に配信されますが、1回以上配信されることもあるということ。
また、キュー内のメッセージ処理が順不同であるということです。
まとめると‥
・少なくとも1回は配信なので、1回以上配信されることもある
・キュー内のメッセージ処理順は順不同のため、順番が前後する可能性がある
上記のような状態が起こると困る要件の場合は、②FIFOキューを使用します。
②FIFOキュー
標準キューとは異なり、メッセージの処理順序は、送信または受信された順序が厳密に保持されます。
・1回のみ配信
・キュー内のメッセージ処理順が順番通りになることが保証されている
使い分けとしては、メッセージの順番や配信回数に制約がある場合にはFIFOキューを使うのが良いでしょう。
遅延キューについて
遅延キューを使用すると
メッセージが配信されてからポーリングができるようになるまでに一定の期間を設けることができます。
例えば、別のシステムとあわせて動くような処理で、メッセージが配信されてから数秒間待ってから処理をしたいといった場合に便利です。時間は、0秒~15分の間で設定が可能です。
イラストでイメージを見てみましょう!
仮に遅延キューを1分で設定していた場合、メッセージがキューに配信されてすぐの10秒後にはまだポーリングでメッセージの読み込みができません。
これは、遅延キュー1分と設定している範囲内のためです。
では、2分経ったらどうでしょうか?
遅延キューの設定の範囲外になるため、メッセージをポーリングして読み込めるようになります。
近い仕組みで、メッセージタイマーというものもあります。
メッセージタイマーは、キュー単位ではなくメッセージ単位で遅延を設定できます。
メッセージ毎に遅延したい時間が異なる場合に便利です。
設定画面▼
まとめ
ここまで、SQSの役割と主要機能について解説しました。
Amazon SQSはサービス間のデータのやり取りをゆるやかに「つなぐ」ことで、開発コストの大幅な削減が期待できたり、耐障害性が高くなるサービスでした。
要件にあわせて、上手に活用していきましょう!