第11章 ストリーム処理
前の章
前の章である第10章 バッチ処理はこちらです。
ストリームとは
ストリームとは、時間の経過とともに段階的に利用可能になるデータを指します。したがって、データセットは決して終わることがなく、これまでに受信したデータを処理する必要があります。一方、バッチ処理では、データベースがいつ終了するかがわかり、その後に計算を開始できます。
ストリーミングでは、入力は、ある時点で起こった何かの詳細を含む不変オブジェクトであるイベントです。これは、テキスト文字列、JSON、またはバイナリ形式としてエンコードされる場合があります。
データ連携頻度を上げる要件
昨今では、データから意思決定をすることが非常に多くなってきています。そのデータは1日前のものではなく、できるだけ新しいデータが必要だという要件が出てきています。
そのようなケースでは、全勝のバッチ処理では実現することができません。そこでストリーム処理のような技術を使ってできるだけ新鮮なデータを貯めていく必要があります。
メッセージングシステム
新しいイベントについてコンシューマに通知するための一般的なアプローチは、メッセージング システムを使用することです。複数のプロデューサ ノードが同じトピックにメッセージを送信できるようにし、複数のコンシューマ ノードがトピック内のメッセージを受信できるようにします。
メッセージ ブローカーは、イベントの負荷をコンシューマ間で分散するか (負荷分散)、すべてのメッセージをすべてのコンシューマに配信するか (ファンアウト)、あるいはその両方を組み合わせることを決定できます。
パーティション化されたログ (Kafka)
ログベースのメッセージ ブローカーは、単にディスク上の追加専用のレコードのシーケンスです。プロデューサはログの末尾にメッセージを追加してメッセージを送信し、コンシューマはログを順番に読み取ることでメッセージを受信します。コンシューマがログの最後に到達すると、新しいメッセージが追加されたという通知を待ちます。
スケールアウトの場合、ログは異なるマシン上でパーティション化され、各パーティションが他のパーティションに対して独立したものになります。トピックは、いくつかのパーティションをグループ化するために定義されます。各コンシューマーはパーティションごとに読み取りオフセットを持ち、グループ化もされます。
Apache Kafka、Amazon Kinesis Streams、Twitter の DistributedLog は、このように動作するログベースのメッセージ ブローカーです。Google Cloud Pub/Sub はアーキテクチャ的には似ていますが、ログ抽象化ではなく JMS スタイルの API を公開します。
変更データキャプチャ (CDC)
データベースに書き込まれたすべてのデータ変更を監視し、それらを他のシステム (検索インデックスなど) に複製できる形式で抽出するプロセス。これにより、データベースが他のフォロワーに対するリーダーとして機能できるようになります。
次の図は、1 つのデータベースに書き込まれた順序でデータを取得し、同じ順序で変更を他のシステムに適用することを示しています。
ログベースのメッセージ ブローカーはメッセージの順序を保持するため、ソース データベースから変更イベントを転送するのに適しています。
CDCの基礎として、データベーストリガーについても押さえておくと良いかと思います。
ストリームの処理
ストリーム処理のプロセスで使用される結合は3種類あります。
ストリームとストリームの結合: 両方の入力ストリームはイベントで構成されており、結合演算子は、ある時間枠内に発生する関連イベントを検索します。
ストリームとテーブルの結合: 1 つの入力ストリームはイベントで構成され、もう 1 つはデータベース変更ログです。変更ログにより、データベースのコピーが最新の状態に保たれます。アクティビティイベントごとに、結合演算子はデータベースにクエリを実行し、強化されたアクティビティ イベントを出力します。
テーブルとテーブルの結合:両方の入力ストリームはデータベース変更ログです。この場合、一方の側でのすべての変更は、もう一方の側の最新の状態と結合されます。その結果、2 つのテーブル間の結合のマテリアライズド ビューに対する一連の変更が行われます。
ストリーム処理がどのように遷移してきたのかをまとめられている記事があります(2016年までのものですが)
まとめ
以上、ストリーム処理について解説しました。
この章ではバッチ処理との違いや業務要件によってストリーム処理が実装されることをお伝えしました。ニアリアルタイムでデータを連携することができるメリットがある一方で、障害も発生しやすくリカバリが難しいというデメリットもあります。
昨今では、便利なツールが出てきているので、それらを活用したりするのも良いかもしれません。
ストリーム処理について特に重要な点を解説しました。ただし、非常に量が多いため解説していない部分が多々あります。詳細は本書を手にとってみて下さい。