Kinesisを触ってはみたものの、特別「これは使いやすい!」という印象ではなかった。
Kinesisの用途は要するに
- AWSにガンガンデータを送る
- AWS側では、送られてきたデータを片っ端から処理する
- AWS側に着いたデータは処理しようがしまいが一定期間(現在は24時間)で消える
というもの。
しかし、AWSへの送信は単純にHTTPSのPOSTリクエストであり、さらにBase64エンコードされているということで特に効率的な方法ではない。むしろ効率をまったく考慮しておらず、シンプルさ、扱いやすさに徹している。
HTTPSのPOSTリクエストであるにも関わらずサイズ上限(現在は50KB)がきついので、小さなデータを送る用途に限定される。
個人的に数十~百台程度のサーバからAWSへのログの集約(Log Aggregation)を計画しているのだが、Kinesisの用途にぴったりか?と考えた一方で、S3でもいけるのでは?と思った。
S3も
- AWSにデータを送るために使える
- HTTPSのPOSTリクエストでデータを送ることができる
という意味ではKinesisとまったく同じ。各オブジェクトのサイズの上限はKinesisよりずっと緩い(具体的にいくつなのかは調べてませんスミマセン)。
そのため、ログ集約にS3を使うというのも十分に悪くない考えのように思える。
S3では
- 秒間100以上のPUT要求がコンスタントに発生する場合
を「high request rate」と定義しているようである。(ドキュメントへのリンク)
そのため、Kinesisとは1桁以上、対象としているトラフィックの性質が異なるようだ。
ただしS3へは例えば「ログを100行まとめて1つのオブジェクトに入れる」みたいに少し工夫するだけでこの問題は解決する。
KinesisにするべきかS3にするべきか。
シンプルさ
S3の場合、各サーバがそれぞれS3にアップロードリクエストを送るだけでAWSへの集約そのものは終わるというシンプルさが非常に大きな利点になる。
Kinesisでは各サーバがAWSへデータを送る一方で、AWS側には別途Kinesisアプリケーションを配置しなくてはならない。
データの消去
Kinesisが自動的に古いデータを消すという点については、ケースによってメリットになったりデメリットになったりするだろう。
データの順番
Kinesisで送られてきたデータはストリームとして扱われるので、あるデータを処理したら「次のデータ」を取得する、というアクションが可能である。
S3では各オブジェクトはバラバラなので、「次のデータ」のような概念が必要な場合には、ユーザが自分でその仕組みを考えなくてはならない。
数多くのセンサーのようなものからAWSに対してデータを送信し、時系列で処理していきたい場合などには、Kinesisの方が向いていることになる。
S3で時系列に処理していきたい場合には、S3へのアップロードのログが取得できるようになった時点で、ログを元に処理していくような方法が考えられるだろうか。
モニタリング
KinesisはAWSコンソールでほぼリアルタイムに使用状況を把握できるが、S3はできない。この点は明らかにKinesisの勝ち。
ざっくりとした結論
数百~千/秒以上の、それぞれのサイズはそれほど大きくないデータを扱いたい場合にはKinesis、~数百/秒でそれぞれのデータのサイズはそれなりに大きくなる(50KB以上)場合にはS3だろうか。
(余談: FluentdやFlumeは当然向いているのだと思うが、今回はとにかくシンプルにAWSだけで片付けることを考えている)