🔥

Functional Programming in C# まとめ 10章

2024/03/08に公開

9章のまとめは、こちら

Chapter 10. Event sourcing: a functional approach to persistence

この章では以下の内容を説明する。

  • 永続化されたデータについて関数型的に考える
  • イベントソーシングの考え方と実装
  • イベントソーシングシステムのアーキテクチャ

10.1. Thinking functionall about data storage

今日、多くのサーバアプリケーションはステートレスだ。状態は複雑の主要な発生源であるため、この方法は効果的であることが証明されている。

しかし、DBの値が更新や削除されるとしたら、グローバルでミュータブルな状態の大きな塊を共有してるようなものだ。

RDBには最新の状態のみを保存する傾向がある。が、過去の情報が知りたい場合、大変である。よくある方法としては、過去の状態の履歴を保存しておく方法がある。しかし、これは、何が変わったのかを突き止めるのが困難なので、非効率である。

イベントソーシングでは、イベントのデータを保存する。状態は2次的なものだ。実際に、エンティティの状態は、イベント履歴の関数である。

10.2. Event sourcing basics

イベントソーシングの基本的な考え方

  • イベント:何が起こったか?の詳細情報
  • 状態:ある時点のエンティティのスナップショット
  • 状態遷移:状態とイベントを取り、新しい状態を返す関数

イベントは、何が起こったかを示す必要最小限のデータで構成されるため、イベントごとにデータの形式が異なる。これを永続化するには様々な選択肢がある

  • イベントに特化したDBを使う。Event Storeのような
  • ドキュメントデータベースを使う。Redis、MongoDB、その他のような。これらのストレージシステムは保存するデータの構造を仮定していない。
  • 伝統的なRDB

RDBの場合は、ヘッダをつけて、データは本体は、JSONにする。

イベントを永続化する方針の場合、状態は何に使うか?

  • コマンドの実行の仕方を決定するためにスナップショット
  • ユーザに表示するためにスナップショット

ある状態とあるイベントがあれば、次の状態を計算できる。これを状態遷移という。

state -> event -> state

ただし、一番最初は状態がないので、特殊な形式になる。

event -> state

※個人的には、状態の引数にユニット与えればよい気がしますが、それか、Option型にしてMatchするとか。

10.3. Architecture of an event-sourced syteom

イベントソーシングを採用した場合、CQRSにできる、という議論。

Tuples in C# 7

名前付きタプルができるようになったが、その場合タプルの値が変更可能となる。

10.4. Comparing different approaches to immutable storage

状態を永続化しない方法として、アサーションベースの方法もあるとのこと。ただし、アサーションベースの方法を選択するためには、実質的に1つのサードパーティ製品を利用するしか方法がない。

イベントソーシングやアサーションベースの方法をアプリケーションに適用するかどうかは、要件しだい。

Discussion