本記事には前編がございます。
Kinesis と SQS の使い分けについて調べてみた [前編:Kinesis の概要を把握する。]
データを一時的に貯めておく役割を持つ Kinesis と SQS を比較してみようと思い、本記事を執筆しています。
それぞれを利用する場面、非機能面の充実度合い、料金面について主に触れて、比較できたら良いなと考えています。
何かのお役に立ちますと幸いです。
まずはそれぞれの機能や特徴について記載し、最後に比較をしていこうと考えています。
まだ理解が浅く、概要レベルのブログです。ご承知おきください。
後編 (本記事)では、 SQS の概要を記述し、比較しようと思います。
SQS
SQS は「メッセージング」という概念と一緒に語られることが多いサービスです。
まずは SQS の概要を確認するために、以下の動画、スライドを確認しました。
- SQS + Lambda という非同期処理黄金パターン再入門 | AWS Dev Day 2022 Japan
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service
- Sansan がメッセージング (Amazon SQS) でスケーラビリティを手に入れた話|AWS Summit Tokyo 2017
どれも内容が最高に素晴らしいです・・・。
「メッセージング」の概要については、一番上の AWSJ 白石さんの説明が非常にわかりやすいです。
SQS の機能詳細や、Kinesis との使い分けなどについては、真ん中の AWS Black Belt Online Seminar が詳しいです。
Sansan 様の事例は、実例の生々しさがありつつ、メッセージングで受けられる恩恵が明確に語られています。2017 年の資料なので、FIFOキューが東京にまだなかったり、若干古い情報もある点はご留意ください。差し引いても一見の価値ありです。
私としては、上から順番にこの 3 つを視聴することをおすすめします。(最後の Sansan 様の事例で感動的な気持ちになり、視聴した日はよく寝れました。)
メッセージングとは
せっかく動画を見て感動したので、自分の言葉と図で説明します。
私もエンジニアとして働いており、案件で SQS を提案させていただくことがありました。
その経験も踏まえて説明します。
ユーザーからの入力データを元に計算を行って、加工したデータを返却するシステムがあります。数年分の自分の健康診断のデータを入れると、10 年後の自分の健康診断の結果を予想で返してくれるようなシステムです。
インフラは以下の構成です。
処理フロー:
- ユーザーは (ALB の配下にある ECS サービス が提供する) WEB フォームにデータを入力します。
- ECS サービスは、加工処理を行う EC2 にデータを渡します。
- EC2 が処理結果を ECS サービスに返します。
- ECS サービスがユーザーに処理結果を返します。
- ユーザーは BI ツールを使って、加工したデータを確認します。
このサービスは、ユーザー数が徐々に増えていき、問題が出てきました。
問題点:
- 加工処理を行う EC2 の加工処理結果を待機する時間が長く、ECS サービスの CPU・メモリ負荷が大きい。
- ユーザー数が増えると、加工処理を行なっている EC2 の CPU や メモリが枯渇し、処理時間が長くなる。EC2 のスペックを上げたり台数を増やすと利用料金も上がる。
- RDS はライターの台数を増やせないため、スペックを最大にまで上げている。性能のボトルネックになっている。
そこで問題解決のために、SQS を使ったメッセージングの仕組みを入れてみます。
ECS サービスが EC2 にデータを渡すのではなく、SQS にデータを入れて、ユーザーにレスポンスを返すようにします。
これで、ECS サービスは EC2 の加工処理結果を待機することから解放され、ECS サービス の CPU や メモリの使用量が減りました。
それから、EC2 は 一定の間隔で SQS から一定数のデータを取得し、加工処理をするようにします。
EC2 は一定間隔で一定数のデータを処理するため、ユーザーが増えても同じペースでデータを処理します。
EC2 はユーザー数の増加に応じてスペックを上げたり台数を増やすことから解放されました。EC2 の CPU や メモリの使用量が減りました。
RDS に関しても、EC2 からのデータを一定の間隔で受け取るので、CPU や メモリの使用量が減り、スペックを下げることができました。
また、一定間隔で一定数処理するため、インスタンスの CPU やメモリを効率的に使えるようになりました。混雑時間帯以外で CPU や メモリ の余剰が発生することもなくなりました。
混雑時間帯のデータは、その後の時間帯にまたがって処理しています。
このようにして、1 つのサービスだったものは 2 つの疎結合なサービスに分割されました。
どちらかのサービスを止めた場合にも、片方が動き続けることができます。
WEB サービスはユーザー数の増加に応じて適切に台数を増やすことができる、軽量なコンテナです。
データを加工するサービスは、一定のリソースを効率よく使ってデータを処理します。
中間の SQS はデータを無制限に置くことができます。(最大保存期間は 14 日。)また、SQS のデータは複数のデータセンターに重複して保存しているため、冗長化もバッチリです。
ユーザーは処理結果を BI ツールで見ることができます。
混雑時間帯は、加工された結果が見えるまでに時間がかかることがあります。(結果整合性) これは許容しないといけません。
メッセージングにより、異なる性質の処理を分割して疎結合にして、サーバーリソースを効率よく柔軟に、運用性を高めて使うことができます。
その代わり、データが反映されるまでのタイムラグ (結果整合性)を許容したり、処理結果を通知する仕組みなどの考慮が必要になることもあります。
以上、メッセージングの説明でした。
実際の現場ではデータ加工処理をする EC2 を Auto Scaling にして、より柔軟にデータ処理したり、更なる性能面の工夫をしています。
SQS の特徴
- SQS は 1 つのメッセージが可能な限り 1 回だけ処理するように設計されている。(P2P 方式)
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 22 スライド目 (P2P 方式)
- SQS では、あるノード(受信者)がキューからメッセージを取得しているときに、他のノードが同じメッセージを取得できないようにする機能がある (「可視性タイムアウト」という)。
- 「可視性タイムアウト」により、同じメッセージが 2 回処理されることは基本的にはない。しかし、処理中にタイムアウトを過ぎることもあるので、「同じメッセージを 2 回処理しても良い設計」(冪等性)が必要。
- SQS + Lambda という非同期処理黄金パターン再入門 | AWS Dev Day 2022 Japan の 42 スライド目
- 同じメッセージを 2 回送りたくない場合は、FIFO キューも検討する。スタンダートキューは順序性も担保しないので、順序性を考慮する場合にも FIFO キューを検討する。 スタンダートキューは TPS 無制限なのに対し、FIFO キューは制限がある点に注意。
- 1 つのメッセージを 1 回だけ処理するようにするために、ノード(受信者)がキューからメッセージを取得した後には、そのメッセージをキューから削除する必要がある。
- AWS Lambda を使うと、キューからメッセージを取得する処理を定期的に実行するように設定できる。また、取得したメッセージのキューからの削除を自動で実行できる。さらに、メッセージが多いときに取得処理を行うノードを自動で増やすこともできる。
- SQS + Lambda という非同期処理黄金パターン再入門 | AWS Dev Day 2022 Japan の 52〜56 スライド目
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 22 スライド目 (P2P 方式)
- SQS で 1 つのメッセージを複数回処理するためには、SNS を使う(Publish Subscribe 方式)
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 22 スライド目 (Publish Subscribe 方式)
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 44 スライド目 (右側)
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 22 スライド目 (Publish Subscribe 方式)
Kinesis との違い
- ストリーミングデータは Kinesis 、メッセージは SQS
- ストリーミングデータは、例えば「1 分ごとの体温」、「生放送中のカメラの映像」など連続するデータ。
- メッセージは、例えば「A さんの身長・体重・BMI」「B さんの〜」など、不連続な脈絡のないデータ。
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 18 スライド目
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 25-26 スライド目
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service の 61-62 スライド目
- データの送信者と受信者
- Kinesis
- 送信者は、IoT センサー (のデータ)、スマホアプリ (から送信する画像)、サーバー (のログ) など
- 受信者は、ストレージ (S3)、データベース (DynamoDB、Redshift)、可視化ツール (OpenSearch、Tableau) など
- SQS
- 送信者は、コンピューティングサービス (Lambda, ECS , EC2) など
- 受信者は、コンピューティングサービス (Lambda, ECS , EC2) など
- Kinesis
参考リンク
- SQS デベロッパーガイド
- Amazon SQS の料金
- SQS + Lambda という非同期処理黄金パターン再入門 | AWS Dev Day 2022 Japan
- 2019/07/17 AWS Black Belt Online Seminar Amazon Simple Queue Service
- Sansan がメッセージング (Amazon SQS) でスケーラビリティを手に入れた話|AWS Summit Tokyo 2017
まとめ
概要レベルで SQS と Kinesis を調べてみました。
それぞれの違いがとてもよくわかり、使いどころもわかりました。
こういったマネージドサービスを利用して、自分で何か作ってみても面白そうに思いました。
メッセージングについては、自分が過去に作ったサービスの構成を再レビューしてみるきっかけにもなりました。
調べてみて、素晴らしい資料や、尊敬できるエンジニアをたくさん知ることができ、感謝感謝の時間でした。
余談
山梨はもう気温が 1 桁で震えています。
誰かと会議をするたびに服装について、つっこまれます。
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。
基本的にのんびりした性格です。座右の銘は「いつか着く」