秒間15,000件のデータを Kinesis Data Streams のオンデマンドモードで処理してみました #reinvent

2021.12.04

1 はじめに

IoT事業部の平内(SIN)です。

AWS re:Invent 2021、Serverless and on-demand analytics として発表された Kinesis Data Streams のオンデマンドモードでは、書き込み 200 MiB/秒、200,000 レコード/秒、読み取り 400 MiB/秒まで、シャード数の設定なしで利用できます。

このアップデートについては、既に、ここDeveloppers IOでも詳しく紹介されています。

そして、下記の記事でスケールの状況が、紹介されていました。
Amazon Kinesis Data Streams On-Demand – Stream Data at Scale Without Managing Capacity

本記事は、このオンデマンドモードで、ストリームがスケールする様子を、「少しでも体感してみたい」ということで、手元で試してみた記録です。

2 構成

動作確認のために用意した構成は、以下の通りです。

EC2上で、MQTTのpublishを行うプログラムを動作させ、AWS IoTのルールでKinesis Data Streamsに流しています。 後段のLambdaは、到着したレコード数をログ出力するようになっています。

基本的なトラフィックは、下記のようなものを設定してみました。通常100rpsで、たまに15,000rpsまでバーストするイメージです。

  • 0〜 9秒 100/rps
  • 10〜19秒 15,000/rps
  • 20〜29秒 100/rps

参考:大量のMQTTを送信するプログラムは、下記のものをベースに準備しました。

3 プロビジョニングモード(シャード数 16)

最初に、構成の確認です。

バースト時のデータ数が 15,000/rpsなので、一旦、シャード数に16に設定し、全てのレコードが、遅延(エラー)なく処理できている状況を確認しています。

図は、左から下記を集計しています。

  • メッセージブローカーにPublishされた、レコード数(秒)
  • ルールでKinesisへの転送に成功したレコード数(秒)
  • ルールでKinesisへの転送に失敗したレコード数(秒)
  • Lambdaで処理したレコード数(秒)

送信したデータ数が、毎秒、正確にPublish-Inにカウントされ、ほぼ遅延なく、全てルール処理され(エラーなし)、同数が、Lambdaで処理したレコード数となって出力されています。

4 オンデマンドモード

続いて、上記のシャード数を一旦、1まで変更した後、オンデマンドに設定しました。

確認してみると、100rpsでは問題ありませんが、15,000rpsになった途端、ルール転送で大量のエラーが発生してLambdaまでレコードが到着していない状況が確認できます。

5 ピーク 2000rps / 2500rps

どれぐらいのデータ数まで対応可能なのかという意味で、バーストのデータ数を変更してみました。

  • バーストを2,000rpとすると処理可能(上図)
  • バーストを2,500rpsとすると、少しエラーが発生(下図)

オンデマンドで新規に作成したストリームは、デフォルトで4,000/secまで対応可能なはずですが、今回は、シャード数を一旦、1にプロビジョニングしたストリームをオンデマンドに変更したので、それが影響しているかも知れません。

6 スケール

ストリームがスケールするように、少し、2,500rpsを流してみました。 当初、エラーが大量に発生してました(上図)が、数分するとエラーは出なくなりました(下図)。

これが自動的なスケールなのですね。

今度は、5,000rpsで試してみました。こちらも、最初エラーが発生してました(上図)が、同様に数分後エラーは出なくなりました(下図)。

思い切って、15,000rpsで試してみました。こちらも数分でスケールできたようです。

7 最終確認

最初の要件に戻って、下記のトラフィックを流してみたところ、今度は、まったく問題なく処理できました。

  • 0〜 9秒 100/rps
  • 10〜19秒 15,000/rps
  • 20〜29秒 100/rps

  • Publish-In

  • Lambdaで処理したレコード数

グラフで見ても、Publishで到着したデータが、ほぼ遅延なく処理できているようです。

8 最後に

ほんの少しですが、Kinesis Data Streamsのオンデマンドのスケールアウトを体感できた気がしました。

トラフィックが増大しても、自動的にスケールしてくれるは、非常に強力であり、要件が、オンデマンドモードの最大値に収まるのであれば、是非採用したいところですが、今回見たように、急なトラフィック増加では、スケールするまで数分は、処理が追いつかない場合がある事に考慮が必要そうです。

また、「過去30日間のピーク書き込みスループットの最大2倍に対応」となっており、スケールインもするはずなので、その点も注意が必要だと思います。