KinesisとSQSの比較検討のため、Amazon Kinesis Data Streams のチュートリアルをやってみた

モバイルアプリサービス部の五十嵐です。

KinesisとSQSの比較検討のため、Kinesisをより知るために公式のチュートリアルをさわってみました。

前提知識として

前提知識として、ストリームとシャード、プロデューサーとコンシューマーなどの用語の意味を抑えておくといいと思います。AWS Black Belt Online Seminarのスライドがわかりやすかったので紹介しておきます。

AWS Black Belt Online Seminar 2017 Amazon Kinesis

チュートリアル

チュートリアル: Amazon Kinesis Data Streams を使用したウェブトラフィックの可視化 - Amazon Kinesis Data Streams

概要

このサンプルアプリケーションは、さまざまな URL からのシミュレート上の閲覧者の数を Kinesis data stream に投入するデータプロデューサーを作成します。ストリームはそれらのデータレコードを受け取った順に保持します。データコンシューマーは、ストリームからこれらのレコードを取得し、特定の URL からの閲覧者の数を計算します。最後に、単純なウェブアプリケーションは計算結果をリアルタイムでポーリングし、計算結果を可視化します。

チュートリアル: Amazon Kinesis Data Streams を使用したウェブトラフィックの可視化 - Amazon Kinesis Data Streams より抜粋

実践

必要なリソースは全てCloudFormationに定義されているので、手順に従いCloudFormationのStackを作成します。

Stackの作成により、EC2インスタンスにアプリケーション(Amazon Kinesis Data Visualization Sample Application)がデプロイされます。

このアプリケーションが、ストリームにデータをPUTするプロデューサーと、ストリームからデータをGETするコンシューマーと、コンシューマーが集計して保存したデータを可視化するアプリケーションの3つの役割を含んでいます。

その他にDynamoDBのテーブルが2つ作成されます。1つはシャードイテレーターと呼ばれるもので、コンシューマーがストリームのシャードをどこまで読み込んだかが記録されるテーブルです。もう1つはコンシューマーがストリームから取得するデータを格納するためのテーブルで、可視化アプリケーションが参照します。

リソースの全貌

Kinesisに対する気づき

  • SQSはキューサービスなのでレコードを取り出して削除するまでがクライアントの役割なのに対し、Kinesisはストリームサービスなのでクライアントはどこまで処理したかを記憶しておくだけでレコードを削除するという考え方はない。(どちらもレコードにTTLがあるのは同じだけど)
  • プロデューサーからの大量のインプットをさばくためには、コンシューマーも並列数を増やす必要があり分散コンピューティングなどの技術が求められることがある。それをサポートするためにKinesis Client Library(KCL)というライブラリが提供されている。
  • それでもコンシューマーを作るのはそれなりに難しそうだから、できるだけLambdaを使って楽をしたい。
  • レコードを加工する必要がないのであれば、Kinesis Firehoseを使って直接データストアに格納するのが良い。Kinesis Firehose のありがたみが理解できた。
  • Kinesis Analyticsを使うと、ストリームのデータをそのままSQLのインターフェイスで集計できる。すごい。

Kinesis Data StreamsとSQSの比較

以下は、2018/04/01時点で筆者が調べた情報です。必ず一次情報を確認してください。

項目 Kinesis Data Streams SQS
耐久性 3つのAZでデータが同期的にレプリケートされる 単一リージョンの複数AZに保存
スループット シャード単位
書込み:1秒あたり1,000レコード
読み取り:1秒あたり5 件のトランザクション
標準キュー:制限なし
FIFOキュー: 1 秒あたり300件のオペレーション
オペレーションあたり最大10件なので3,000件
レコードの保持期間 24時間~7日間 1 分間~14 日間
レコードのサイズ 1MB 1KB~256KB
レコードの容量制限 シャードの数による 無制限
転送中メッセージの数については
- 標準キューで 120,000
- FIFO キューで 20,000
順序保証 ミリ秒精度のタイムスタンプで並べ替えが可能 標準キュー: ベストエフォート
FIFOキュー: 厳密な順序
レコード配信の重複 不明 標準キュー: 少なくとも1回
FIFOキュー: 確実に1回
レコード配信のレイテンシ 1秒未満 不明
(筆者の体感的には即時)
リクエストのレイテンシ 不明 数十ミリ秒~数百ミリ秒
料金体系 シャード時間+PUT ペイロードユニット
拡張データ保持期限は追加料金
100 万件のリクエストあたりの料金

また、Amazon Kinesis Data Streams と Amazon SQS の違いについては、 Amazon Kinesis Data Streams – よくある質問 でも詳しく言及されています。

まとめ

Amazon Kinesisはこれまで業務で使う機会がなかったのでなんとなくのイメージしかありませんでしたが、チュートリアルを通じてさわってみることで基本的な知識を体得できました。AWSにはすばらしいチュートリアルやドキュメントが用意されているので、活用してみてはいかがでしょうか。

参考