chikipapaです。
AWSの中級レベルの認定試験である「AWS Certified Solutions Architect - Associate」に向けて勉強中です。初級レベルの試験に向けては演習問題を解きつつサービスの名前とサービス概要を用語集のような形に整理して覚えていきましたが、今回は演習問題で出題頻度の多いサービスについて主な特徴や機能を覚えていこうと思っています。備忘録としてここに書いていこうと思っています。
※記載事項の中には、覚えやすいように話を単純化したり現時点では誤って覚えていたりすることもあるかもしれません。ご了承ください。
今回は「Amazon SQS」についてです。
Amazon SQSの特徴は以下の通り。(詳細については後述します)
■コスト抑止
・キューからの取得リクエスト回数を抑止する仕組みがあるのでコスト抑止もできる
■安全・安心
・なによりも「消失してしまわないこと」を重視しているから安心!
・順序保証や重複防止も可能だから安心!
・メッセージは保管時に暗号化してくれるから安全!
■省力化
(なし)
■お役立ちポイント
・メッセージの送信側と受信側を疎結合(非同期通信)にし、設計や運用の柔軟性を上げる
(詳述)
相手が待ち構えている時にしかメッセージが送れないならば、送信できる時間が限られてしまったり、送ったけど受け取ってくれなくて何回もリトライすることになったりして不便ですよね。そこで重宝されるのが非同期送信を実現するキューイングサービスです。
送信側は好きなタイミングでメッセージを送り、それをキューイングサービスが保管しておき、受信側が好きなタイミングで取り出すという流れで、送信側・受信側ともに時間を気にせずに自分がやりたいことができるというわけです。現実社会ですと「宅配ボックス」がこれにあたります。
メッセージを送受信する仕組みにおいて最も大切なことはなんでしょうか?私は「メッセージが消失してしまわないこと」だと思います。メッセージの順序を保つことや重複して送信してしまうのを防ぐことももちろん大切なのですが、それらについては周りの機能が頑張ればなんとかなります。しかしメッセージが消失してしまったら、それはどうにもできなくて困ってしまいますよね。Amazon SQSにも「メッセージが消失してしまわないこと」を意識した仕組みがあります。
まず1つ目は、保存できるメッセージ数が無制限ということです。よって、大量でメッセージが発生しても、容量が足りずに捨てられるということはありません。
2つ目は、メッセージは明示的に削除コマンドを発行するまで消えないということです。
私がイメージするキューイングサービスは、キューからメッセージを取り出したら(アプリケーションに引き渡したら)、重複を避けるために、キューの中にあるメッセージは削除するというものです。でもこれだと、急にマシンがダウンしてメモリが消失してしまうとメッセージも消えてしまいます。よって、DBに保存するなどデータが保全された後に削除コマンドを発行して消すとしたほうが安全なのです。
3つ目はデッドレターキューを設定することができるということです。アプリケーションで受け取ったは良いがメッセージが不正な内容だったり壊れていたりして何回試してもうまく処理ができないということが起こりえます。その場合、そのデータがスキップできないと後続データの処理が進みませんし、さすがに何日間(※)もエラーデータの処理を繰り返していたらメッセージは消えます。そうならないために何回か処理に失敗したら一旦、データを退避する仕組みがデッドレターキューです。ここに保管されたデータは明示的に削除しない限り残りますので、あとから調査などのために参照することができますし、その内容をもとにデータを補完することもできます。
※デフォルトで4日、最長で14日がキューの保持期間です
上記のようにメッセージが消失しない仕組みはうれしいのですが、業務で利用するとなると順序保証や重複防止の仕組みも欲しいところです。上記は重複して送信するリスクがありながらも、明示的に削除コマンドを発行するまでメッセージを残し続けるということを書きました。しかし、それだけだと大量の重複データが発生することになり後続処理が大変な思いをすることになってしまいます。そこで「ある処理でメッセージを取り出したら、一定時間内は他の処理にはメッセージを取り出させない」仕組みがあります。これを「可視性タイムアウト」と呼んでいます。
もう1つの仕組みは、FIFOキューというものです。Amazon SQSの標準キューは順序保証や重複防止を必ず実施してくれるわけではありません(できるだけ頑張るという姿勢です)。それに対してFIFOキューはAmazon SQSに届いた順に出ていくことを保証してくれます。
安心・安全という面からもう1つ紹介しておくと、Amazon SQSに保管されているデータは暗号化されているので安全です。Amazon KMSという暗号鍵を安全に作成・管理するサービスと連携してデータを暗号化してから保管しています。
次にコスト抑止につながる仕組みについて紹介します。
Amazon SQSからメッセージを取り出す場合に「ショートポーリング」と「ロングポーリング」という2つの方式があります。ショートポーリングは、アプリケーションがキューからメッセージを取り出そうとした時に溜まっているメッセージがなかったら「メッセージ無いよ」とすぐにレスポンスを返すものです。これがロングポーリングだと、少し待てばメッセージが来る可能性があるので数秒待ちます。その間にメッセージが来ればそのメッセージを取り出させますし、来なければ数秒後に「メッセージ無いよ」と返します。
この方式が異なることによってどういった違いが生まれるかというと、ショートポーリングの場合はアプリケーション側からするとすぐにレスポンスが返ってくるので、すぐにリトライすることができます。ただそうするとキューから取り出しにいく回数(取得リクエスト回数)が多くなるので、費用が取得リクエストごとに発生して嵩みます。
よって、費用のことだけを考えるのであれば、ロングポーリング方式を選択して取得リクエスト回数を抑えたほうがお得というわけです。
以上