7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kinesis Data Streamsでデータ重複はなぜ起きるのか

Posted at

はじめに

概要

Amazon Kinesis Data Streams ではエラーにより、データが重複することがあります。
どのようなケースでデータの重複が発生するのか図を交えながら見ていきます。

この記事で得られること

  • Amazon Kinesis Data Streamsで重複が発生するケースについて
  • 重複の対策

Kinesis Data Streamsについて

Kinesis Data StreamsはリアルタイムでIoTデバイスやスマートフォン等のデバイスからデータを受信して、収集、処理、分析ができるサービスです。
まずは簡単に用語の説明をしていきます。

プロデューサ

プロデューサとはKinesis Data Streamsに対して、データを送信するものです。

  • IoTデバイス
  • スマートフォン
  • PC

といった機器があります。
これらのログやデータなどをリアルタイムにKinesis Data Streamsに送信します。

コンシューマ

コンシューマとはKinesis Data Streamsが受信したデータをポーリング(取得)するものです。

  • Lambda
  • Kinesis Data Firehose
  • Kinesis Data Analytics

などがあります。

これらのサービスを使って、後続のS3やDynamoDB,RDSなどにデータを送信することが可能です。
Lambdaを経由してデータに処理を行った後、データベースへ登録する。
Kinesis Data Firehoseを使ってリアルタイムにデータをS3へ登録する。
といったことが可能です。

レコード

データのこと。

シャード

データを書き込むところ。
シャードはデータの書き込み量によって増減します。
一つのシャードは毎秒最大1MBのデータ書き込み、毎秒最大2MBのデータ読み込みが可能です。

ストリーム

複数のシャードを管理する枠組み。
ストリームには一つ以上のシャードが存在します。

メインとなる用語はこのくらいです。
全体像は図のような感じです。
image.png

データ重複

では、ここからデータが重複するパターンを見ていきましょう。
データが重複するパターンは、以下の2つがあります。

  • プロデューサからKinesis Data Streamsへデータ送信時にエラー
  • Kinesis Data Streamsにポーリングする時のエラー

プロデューサ→Kinesis Data Streams

まずは プロデューサからデータを書き込むときのエラーです。
データの書き込みはプロデューサ側からPutRecord APIを叩く必要があります。
通常、 問題なくデータが書き込まれる場合の図を示します
image.png

全体の流れは、

  1. プロデューサがデータを送信
  2. PutRecord APIでシャードへ書き込む
  3. シャードから書き込みができたことをプロデューサへ通知
  4. シャード内に書き込まれたレコードをコンシューマがポーリングする
  5. ポーリングしたデータを後続のデータ配信先に配信する

という感じです。
では書き込み時にエラーが発生するとどうなるでしょうか。
image.png

プロデューサはデータを送信しますが、それに対する書き込みの通知が返って来ません。
すると、 プロデューサーは再度データを送信します。
これにより、シャードに同じデータが登録されるということが発生します。
image.png

この図では、シャードに同じレコードが複数登録されたことにより、コンシューマであるLambdaを通してデータベースでデータの重複が発生しています。

Kinesis Data Streams→コンシューマ

次に、コンシューマがデータをポーリングする際にエラーが発生するパターンを見てみます。
こちらはシャード内にはレコードが登録正常に登録されています。
そのレコードをLambdaがポーリングする際にエラーが発生したケースです。
image.png

エラーが発生するまでのデータは先にデータベースへ登録されます。
その後、再度Lambdaがシャード内のレコードをポーリングします。
それにより、DynamoDBでデータの重複が発生してしまいます。
image.png

対策

対策として
シャードに書き込まれる各レコードに一意のIDを割り当てるという方法があります。
これはKinesis Data Streams側ではなくプロデューサ側で実装します。
IDをDynamoDBの項目の一部として使用することで、同じレコードが二度書き込まれても、二度目の書き込みは単に既存の項目を上書きするだけとなり、結果的には同じデータが二度書き込まれても影響はありません。

これは対策の一つなので、この実装が難しい場合は他の対策を取る必要があります。

まとめ

Kinesis Data Streamsはそれ単体では機能せず、他のサービスとの連携が重要です。
プロデューサのデータを加工する必要があるのか、リアルタイムでの収集が必要なのか、
などデータをどのように扱うかによってKinesis Data Streams移行の処理が変わってきます。
そのため、設計の段階で全体像を把握して設計する必要があります。

所感

Kinesis Data Streamsは聞きなれない用語が多く、DVAの試験問題で詰まることが多かったですが、用語を理解してしまえばすんなり理解できるようになりました。
ただ、実際に手を動かして動作を確認できていないので次は実際に手を動かしてみようと思います。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?