AXONフレームワークを用いたチュートリアルをやってみた
目的や背景
社内でマイクロサービスアーキテクチャ(MSA)の問い合わせや相談が増えてきたが、そんなに事例がないため、色々なパターンに対応できないので、知識習得のために、チュートリアルをやってみた。
参考書籍やサイトなど
- マイクロサービスパターン(Chiris Richardson著)
- Udemyのコース(AXON+SpringCloud)
https://www.udemy.com/course/spring-boot-microservices-cqrs-saga-axon-framework/learn/lecture/26251768?start=75#overview - https://microservices.io/
チュートリアルの概要と利用技術要素
業務機能としては以下のサービスに分割されている
- UserService
- PaymentService
- ProductService
- OrderService
基本的な流れとしては、Productをある数量分登録し、それに対してOrderが入るたびに、在庫を減らしていき、Paymentが成立すると、Orderが承認されるという流れである。
なお、何らかのエラーの場合には補償トランザクションが発行される。
直接の業務機能とは関係ないが、以下のSpringCloudのサービスも利用している。
- Eureka (Service Discovery)
- API Gateway
MSAのメッセージブローカーやイベントソーシングのフレームワークとしては、AXONを使っています。
AXONは、フレームワークとサーバーがある。
今回はサーバーは、Dockerで構築した。
https://axoniq.io/
ごく一部のシーケンス図
非常に見づらいがOrderを生成する部分のシーケンス図を書いてみた。
実際にAXONサーバーがどのように機能しているかは分からない部分もあるので、推測を含みます。
ざっと流れを記述すると、、、
- Controller(APIのエンドポイント)は、POSTされた内容から、CreateOrderCommandを生成し、Gateway経由で、AXONサーバーに渡します。
- AXONサーバーは、OrderAggregate(ドメインオブジェクト)を生成します。
- OrderAggregateは必要な業務処理をし、OrderCreatedEventを生成し、AXONサーバーに渡します。
- AXONサーバーは、OrderCreatedEventをOrderSaga(サーガのオーケストレータ)とOrderEventsHandlerに伝播します。
- OrderSagaはサーガのオーケストレータとして、後続のイベント処理を司ります。(条件によっては、補償トランザクションを発火させます。)
- OrderEventsHandlerは、(SpringJPA使っている場合)Repository経由でJPAを用いて永続化をします。
ソースコードサンプル
AXONを用いたMSAのPro/Con
Pro
- イベントソーシング、CQRSを前提としているので、MSAの王道を行くフレームに則れる。
- ドメインロジックがAggregateに集まるため、コンポーネントの責務が明確になる(Aggregateは一部AXONのライブラリーをMockに差し替えればテストもしやすい)
Con
- このチュートリアルでは、複数サービス横断のコマンドやイベントをcoreというプロジェクトに集めているが、この部分は、各サービスがcoreの実装に依存している。全サービスをJavaで作るなら問題ないが、そうでない場合には、ここの抽象度を高める工夫が要る
- コマンドからイベントへのデータの詰め替えなどの操作が多く、冗長に感じる。
まとめ
実際に、チュートリアルで手を動かすことにより、実感することは多いと再認識しました。