dev.nfurudono.com

適切なCQRS+ESの実現方式を探求している

軽量に行うCQRS+ESを考えている。

文脈間の依存関係を綺麗に分けたいが、デプロイやデータベースを分けることはそれらをまたぐ変更とか一貫性の担保が難しくなるので避けたい。マイクロサービスのようにOSとかKubernetesの仕組みによって文脈を分けるのではなく、アプリケーションレイヤの仕組みで綺麗に分けるのが目指すべき姿だと考えている。パフォーマンス最適化を考慮から外せる場合、マイクロサービスは妥協だと思っている。アプリケーションレイヤの関心ごとを分離するための仕組みをアプリケーションというかプログラミング言語のレイヤで分離することを諦めて、より低いレイヤで強制するのがパフォーマンス最適化を無視できる状況でのマイクロサービスの使用なのだと認識している。

世で見る多くのCQRS+ESの発表では、イベントでコミュニケーションする、そのためには非同期プログラミングを行うしマイクロサービスとイベントバスを用いる、みたいなことを暗にも陽にも主張している。僕はそうではないと考えていて、非同期やマイクロサービスは必須ではないし、パフォーマンスを無視するならば不必要なプログラミングの複雑さを導入するので避けるべきだと考えている。この不必要な複雑さを避けたCQRSを求めて、「軽量に行うCRQS+ES」を考えている。

sqlc を規約を持って用いることでCQRSは実現できるだろう(僕はGoでsqlcを用いて開発しているのでsqlcを持ち出している)。ESはどうだろうか。またどのような規約を持つとよくて、それを軽量に実現するためにはどのような技術が有効だろうか。