Serverless FrameworkとTypeScriptでCQRS/EventSourcingを実現する 概要編
CQRS イベントソーシングやってますか?
なかなかCQRSとイベントソーシングを個人でちゃんとやろうと思うと難しいですよね。
そして本気でパフォーマンス考えるならスナップショットなども考慮してAkka一択な感じがありますよね。
でもそれなりのパフォーマンスを実現するのであれば、
それを実現できるデータベースはいくつかあります。そうDynamoDBもね!
参考
zozo technologiesは本番環境でも稼働させているようですね。
CQRSやろうと思ったけど挫折した?
わかります。ちまたの殆どの実装はDDDを前提としたCQRSです。
DDDの戦術的側面が非常に複雑でそれをCQRSに適応しようとするから
挫折するのです!
一体どういうことかというと、下記の組み合わせが複雑すぎるのです。
- DDDの戦術的側面(技術的側面)と戦略的側面
- CQRSのどちらかというとイベントドリブンなアーキテクチャ
ちょっとだけ図解しますね。(ただ最近Draw.ioでドキュメント書くのが楽しいので書きたいだけ笑)
CQRSやるのに必要なことDDD or シンプルなイベントドリブンアーキテクチャ
CQRSをやるのに実はDDDの側面はなくても成立する。
ここもちょっとだけ図解しますん。
上の方は、コメントも付きで非常に複雑なやつで、下の方はシンプルにした場合です。とはいえ、図で表すと上と下であまり変わらないのですけど、本気で上の方を実装すると非常に辛い。
モチベーション
DDDは、面白いけど、非常に複雑でそしてめんどくさい。
書き込みと読み込みでモデルを分けるのはエンジニアをやる上では、どんな形であれ経験することになるのでそれをしっかりとした形で経験することでその後の応用の幅が広がる。はず。
技術選定
DynamoDB(強い整合性を持つ)
- 条件付き書き込みができる。
- 保存したデータのキャプチャができる。
- パーティションキーでsherdingされるので大量のイベントを登録しても速度が落ちない
- 使ってないときにお金を使いたくないのでServerlessなデータベース
DynamoDBしかない!
ServerlessFramework
- 個人開発に使いたいので使わないときにお金がかからないLambda
- イベントの順序が保証できる EventBusとしてFIFO SNS + FIFO SQS
- 型定義がないのはお手軽とはいえ負債にしかならないのでTypeScript
それを実現可能で、量産できるServerlessFrameworkを採用
実際にどう実装するかは次の記事で
モチベーションが上がるので興味ある方はリアクションくださいー。
最後に一言
この構成で実際にCQRSやってみて、シンプルに実装したのに比べて
やはり、CleanArchitectureってめんどくさいなって最近思ってます。自分には割とToo Much。やってもOnionArchitectureで止めたい。
Discussion