結論 †
要約 †
もし、単一のモノリシックデータベースがデータの格納や、アクセス、処理に関するすべての要件を満たすことができれば、アプリケーションの開発は非常に簡単だ。しかし、規模やデータアクセスパターンの複雑さ、あるいはその他の理由により、もはやそんなことはない。これは、アプリケーション開発者が信頼性が高くスケーラブルで保守可能なアプリケーションを構築するのに役立つガイダンスとパターンが欠落している。
このレポートでは、不変イベント(イベントログ)のストリームにもとづいて、大規模なアプリケーションを構築するための特定のアーキテクチャスタイルについて検討した。ストリーム処理は、分析や監視の目的(例えば、詐欺検出のための特定のパターンの検出、時系列データの異常に関する警告など)ですでに広く使われているが、このレポートでストリーム処理も伝統的にOLTPデータベースの領域(インデックの管理やマテリアライズド・ビュー)にあると考えられることが分かった。
この世界観では、イベントログは記録のシステム(真実のソース)とみなされ、他のデータストアはストリーム変換(マッピング、結合、集約イベント)によって派生する。入ってくるデータはログに書き込まれ、読み取り要求はデータの一部の射影(projection)を含むデータストアから処理されます。
ログ中心のシステムについて我々が行った最も重要な観測をいくつか以下に示す。
- Apache Kafkaなどのイベントログは非常によくスケールする。シンプルなデータ構造であるため、複数のマシンに分割して複製することが容易で、信頼性が比較的簡単である。 I/Oはほとんどがシーケンシャルなので、ディスク上で非常に高いスループットを達成できる。
- すべてのデータがログ形式で利用可能な場合、異なるシステム間でデータを統合して同期する方がはるかに簡単になる。全てのコンシューマが同じ順序でイベントを参照すると、競合状態を回避し、障害から簡単に復旧できる。ストリームを巻き戻したり、イベントを再処理して新しいインデックスを作成したり、破損から復旧することができる。
- マテリアライズド・ビューはストリーム・プロセッサーを介して維持され、リードスルー・キャッシュの良い代替手段である。ビューは完全に事前計算されており(コールドスタートの問題を回避し、新しいビューを簡単に作成できるようにする)、変更イベントのストリームによって最新の状態に保たれる(競合状態や部分的な障害を避ける)。
- イベントログとしてデータを書き込むと、データベースを直接更新するよりも品質の高いデータが生成される。たとえば、あるユーザーがショッピングカートに商品を追加してからその商品を削除すると、分析や監査、レコメンデーションシステムはそのことを知りたいだろう。これがイベントソーシングの背景にある動機である。
- 伝統的なデータベースシステムは、データが読み込まれるのと同じ形式で書き込まれなければならないという誤った考え方にもとづいている。第1章で見たように、アプリケーションの入力はその出力からは非常に異なっている。マテリアライズド・ビューでは、入力データを単純で自己完結型の不変イベントとして記述し、それをいくつかの異なる(非正規化されたまたは集約された)表現に変換して読み取る。
- 非同期ストリームプロセッサは通常、従来の意味でのトランザクションは持たないが、イベントログの順序を使用して整合性制約(一意のユーザー名、正しい預金残高など)を保証することができる(図2-31)。
- CDCは、既存のデータベースをログ中心のアーキテクチャに移行させるのに適している。完全に機能させるには、データベース全体の一貫性のあるスナップショットと、トランザクションのコミット順の進行中のストリームの両方をキャプチャする必要がある。
- 元となるデータが変更された時に、ユーザーインターフェイスを動的に更新するようにアプリケーションを対応させるには、プログラミングモデルがリクエスト/レスポンスの前提から離れ、ストリーミングデータフローに馴染む必要がある。
我々は未だ、大規模アプリケーションの構築方法、システムのスケーラビリティ、信頼性、保守性を高めるためにどのようなテクニックを利用できるかを考えている。しかし私にとって、この不変イベント、ストリーム処理、マテリアライズド・ビューのアプローチは非常に有望なルートのようだ。私はこの種のアプリケーションアーキテクチャがより良いソフトウェアをより速く構築するのに役立つと楽観的に見ている。
幸いにも、これはSFではない - 今現在起こっている。人々は問題のさまざまな部分に取り組み、良い解決策を見いだしている。我々が使ってるツールは急速に向上している。ソフトウェアを構築することはエキサイティングな時間だ。
担当者のつぶやき †
みんなの突っ込み †