事例からAmazon Kinesisとは何なのかを学ぶ

158件のシェア(すこし話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

以前、Amazon Kinesisを使う案件があり技術調査の手伝いをしたことがありました。AWSのサイトには「大規模なストリーミングデータをリアルタイムで処理する完全マネージド型サービス」とありますが、その時は何のためのサービスなのか触ってもいまいちピンときませんでした。その後、分からなかった点を担当者にいろいろ聞いてみたのですが、案件が事例化されましたので教えてもらったことをブログに書いてみようと思います。株式会社あきんどスシロー様の案件です。以下が構成図になります。

「うまいすしを、腹一杯。うまいすしで、心も一杯。」

kinesushi

処理の流れ

事例の構成図からどのような処理が行われているかを担当者に確認しました。

  1. 回転寿司のすし皿に付いているICタグの情報を管理端末が読み取ります。
  2. 管理端末が読み取った情報はインターネットを経由してAmazon KinesisへPutされます。Putされるデータは一日当たり平均で数百万件だそうです。
  3. 次はKinesis-appという箇所です。ここはEC2になります。管理端末から送信されたデータをAWS CLIを使ってGetします。GetしたデータをCSVに出力しS3にアップロードします。
  4. S3からRedshiftにCOPYコマンドでデータをロードしています。3と4の処理はcronで定期的に行われます。
  5. Redshiftにロードされた最新のデータをBIツールのTableauで可視化して分析します。

疑問点を聞いてみる

処理の流れを確認したところでいくつか疑問が湧いたので確認してみました。

一度、Getされたデータはどうなるのか?

KinesisにPutされたデータはその後24時間はGetすることができます。24時間以内であれば何度でも取得できます。データ取得時に何も条件を指定しない場合は24時間以内のデータすべてを取得しますが、取得したデータにはiteratorというシーケンス番号が振られているので最後に取得したデータのiteratorを条件にそれ以降のデータを取得することができます。AWS CLIの場合は以下のようなコマンドになります。

aws kinesis get-records --shard-iterator <value>

Amazon Kinesisを導入しない場合どうなってしまうのか?

EC2でアプリケーションサーバ立てて管理端末からのリクエストを直接処理するのと何が違うのか聞いてみたところ、大量のリクエストの受け入れ口としてあるとないとではコストが全然違うからだそうです。Kinesis並みの処理をEC2でするためには相当な台数が必要になりコストが上がってしまうということですね。

Amazon SQSではダメなんでしょうか?

話を聞いていたらAmazon SQSみたいなものかな、と思ったのでSQSではなくKinesisを採用した理由を確認したところ以下のような理由でKinesisを採用しているそうです。

  • SQSにはKinesisほどのスケーラビリティが備わっていない。
  • SQSはデータにシーケンス番号は振られておらず、またデータが重複する可能性がある。
  • Kinesisの方が低コスト。

調べてみると他にも以下のような点が違うようです。

  • SQSはリクエストで送れるデータが256バイトのテキストデータのみ。Kinesisは50キロバイトのBLOB。

以下のページにも詳しく書かれていました。
Amazon Kinesis のよくある質問

まとめ

最初は「ストリーミングデータをリアルタイムで処理」という言葉から難しそうなイメージがあったのですが、色々聞いてみて キューのような使い方をするサービス、という印象をうけました。担当者と話していて「コストが安い。」という言葉を何回も口にしていたのでとてもリーズナブルなサービスのようです。私もぜひ案件で使ってみたいと思いました。今回は触れませんでしたがKinesisにはStreamShard(シャード)Partition Keyなどの用語があります。こちらに関しては以下の記事が分かりやすいのでお勧めです。興味のある方はぜひご覧ください。

AWS Summit 2014 Tokyo「Amazon Kinesis Deep Dive」レポート
[AWS Advent Calendar 2013] Amazon Kinesis!