データ処理を素早く行うストリーム処理を考える

# はじめに
これまで、ビジネス状況に応じて俊敏に機能を拡張、変更し易いマイクロサービスアーキテクチャに関して整理してきました。
近年は一方で、DX（デジタルトランスフォーメーション）の中で、データ利活用も進んでいます。いままで、データ処理では、オンライン処理やバッチ処理という考え方が一般に広く知られていると思います。主に、大量のデータ処理には、バッチ処理が用いられてきたと思いますが、より素早くデータ処理を行う考えのストリーム処理の活用も進んでいます。
本記事では、ストリーム処理について、文献の"データ指向アプリケーションデザイン"をもとにして整理してみました。

# ストリーム処理の導入が増えてきた背景　
最近のDXの中では、新たなユーザ体験やUIなどお客様に近いところの取り組み、また、さまざまな問題をデータから分析するデータサイエンスの活用が盛んになって、DXを担うアプリには、大量に発生するデータを、よりリアルタイムに処理する技術の導入することも一つの課題になってきます。

例えば、ECサイトなどでお客様や商品に関する動向を把握するため、あるマスターデータを分析してデータを出力するという要件があったとします。従来技術を活用した実装では、対象とする期間 (例えば１日分)のデータを、一日間隔でまとめてバッチ処理して出力していました。この場合、お客様の動向を把握できる間隔は、１日単位でしか更新ができません。よりリアルタイムにお客様の動向を把握したい場合は、より短い間隔でデータ処理を実現する技術が求められます。DXでは、市場のスピード感により早く応えるためのアジリティの高さが求められるでしょう。
今回ご紹介するストリーム処理は、データの発生からより短い間隔でリアルタイムにデータを処理するアプローチが特徴です。ストリーム処理は、ある複合的な事象の発生をモニタリングする用途で利用されてきましたが、Webサービス等でリアルタイムな商品トレンドの把握や、モニタリングのダッシュボードに活用するなど、新しい利用方法も増えています。

以降で、ストリーム処理の概要について説明します。

# ストリーム処理とは
ストリームとストリーム処理の概要です。

- ストリーム  
時間の経過とともに徐々に利用できるようになるデータ
- ストリーム処理  
ストリームを連続的に処理するためのアプローチやツール。イベントが発生する度に処理するアプローチ

ストリームの発生源として、イベントソーシング、または、既存のデータベースの変更データのキャプチャがあります。ストリームの転送システムに関する技術はメッセージングシステムなどがありますので以降の章で説明します。

以前はあるまとまった期間のデータの処理は単一のマシン上で実行してデータを出力していました。しかし、ストリーム処理の特徴は、イベントに関するデータ毎の小さな単位で複数マシンに分散して処理する上記のような技術によって大量処理を可能にしているところです。

次に、ストリーム処理で作られるデータの活用ケースについて記載します。

# ストリーム処理の活用例
背景の一つにあるのは、ビジネス環境の変化に応じた対応をより短時間に行うことでした。
以降で活用例について説明します。

- イベント等の変化に合わせたシステムの同期
ストリーム処理で検知したイベントは、そのままではメッセージングシステムに一定時間残り、時間の経過で破棄されます。そのため、導き出されたデータをデータベースなどに永続化します。永続化したデータは、他のサービスから参照させることで新たな機能を追加していきます。

- イベントのユーザへのプッシュ
メールやスマホのプッシュ通知などを活用したアラート通知の発信。Webサービスのダッシュボードの表示に必要なイベントの入手。

- 複数のストリーム処理の実施
上記の２つのような出力の前に複数のストリーム処理を経ることが可能。

上記のように、いままでも、ストリーム処理は、モニタリング用途として特定の事象の検知（アラート通知）に利用されています。例えば、売買システムで市場価格の変化を調べ、特定のルールによる売買、製造業の工場内の機械の状態をモニタリングし異常があればすぐに問題を特定する、クレジットカードなどの利用パターンの変化による不正検知などが代表的な利用例です。

最近ではストリームデータをリアルタイムに大量の処理ができるようになった結果、新しい利用例が現れています。AI技術等とストリーム処理の組み合わせなどで、新たな価値を得るための分析処理です。

以下にいくつかの新たな活用例を紹介します。

- ストリームのデータ分析
ある一定期間のイベントのレートの計測（集計や統計）
（例、直近の５分間における秒あたりの平均問い合わせ数のような統計をリアルタイムに計測、ストリームの分析ツールを使用した分析）

- ストリームのデータのリアルタイム検索
ある検索条件を保存し、発生したイベントをすぐにそれらの条件を通して検索
（従来はインデックスを付けたドキュメントの検索）
（例、Webサービスで自分の検索条件を登録し、条件にマッチする物件が出てきたら即時通知をもらう）

- ストリーム処理で分析データ（集計など）の最新化
（例、分析もととなったデータの変更時に変更データでリアルタイムに分析データを最新化）

次に、ストリームデータの発生源やストリームの転送システムに関する技術を記載します。

# ストリームデータの発生源
Webサービスのバックエンドサービスが動作したことで生じるストリームデータの発生源について、代表的なものを以下に記載します。

- イベントソーシング
簡単に説明すると、イベントソーシングはアプリケーションの状態に加えられたすべての変更を変更のイベントログとして記録することです。ストリーム処理はイベントの発生毎にそれらの記録したイベントを対象にして処理していきます。
イベントの例は、"〇〇をキャンセルした"というアプリケーションのイベントの保存。そのイベントに伴いあるテーブルのデータを削除した、あるテーブルに追加したといったデータベースの処理はイベントの発生により起こる作用と説明しています。

- 変更データキャプチャ（CDC:change data capture）
データベースには内部に変更に関するデータが格納されています。変更データキャプチャはデータベース側にストリームの考え方を適用して、データベースに発生した変更データをストリームとしてキャプチャするといった考えです。

# ストリームの転送システム
前章のようなストリームのデータを転送するために使用されるシステムについて記載します。
バッチ処理などは、主に保存したファイルを入力にしてデータを出力していましたが、ストリーム処理では、イベントを記録したメッセージなどを入力にします。
発生したストリームのデータを管理する仕組みにメッセージングシステムがあります。
直接ネットワークを使用して受信者にストリームを送ることができますが、ストリーム処理はメッセージングシステムのメッセージブローカー（メッセージキュー）によるストリームの転送が特徴となっています。
メッセージングシステム上では、発生元からイベント単位でデータを転送しアプリケーションで受信します。メッセージングシステム上のデータは一定時間残り、時間の経過で破棄されます。また、メッセージングシステムは、複数のノードによる処理、ロードバランシングや複数の受信者に配信することを可能にします。

# 参考：ストリーム処理に関するOSS
海外を中心に、企業には、以下のようなストリーム処理(OSS)が導入されています。クラウドベンダーもストリーム処理に関する基盤の提供を始めています。

Kafka/Kafka Streams ：　メッセージングシステムとストリーム処理に関するライブラリ
Spark Stream ： 入手したストリームデータをインメモリで処理するライブラリ
各クラウドベンダーから提供するストリーム処理基盤

# さいごに
文献の"データ指向アプリケーションデザイン"をもとにして、ストリーム処理を整理してきました。
DXでは、取り扱うデータの種類や量が増え、データを分析するデータサイエンスの分野もこれまで以上に普及することが予想されます。
今後、データを処理するアプリが増え、よりリアルタイムな処理を求めることも多くなるでしょう。
このような中で、ストリーム処理の利用範囲も広がっていることなどを考えても、ストリーム処理は、データ処理の解決策の1つになりつつあるようです。
　
# 参考記事
- データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理(Martin Kleppmann, 日本語版2019/7/18)
原文 英語版：Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems(Martin Kleppmann, 2017/4/11)