LoginSignup
4
1

More than 1 year has passed since last update.

AXONフレームワークを用いたチュートリアルをやってみた

Last updated at Posted at 2021-07-08

AXONフレームワークを用いたチュートリアルをやってみた

目的や背景

社内でマイクロサービスアーキテクチャ(MSA)の問い合わせや相談が増えてきたが、そんなに事例がないため、色々なパターンに対応できないので、知識習得のために、チュートリアルをやってみた。

参考書籍やサイトなど

チュートリアルの概要と利用技術要素

業務機能としては以下のサービスに分割されている

  • 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を用いて永続化をします。

Untitled Diagram-Page-1.png

ソースコードサンプル

AXONを用いたMSAのPro/Con

Pro

  • イベントソーシング、CQRSを前提としているので、MSAの王道を行くフレームに則れる。
  • ドメインロジックがAggregateに集まるため、コンポーネントの責務が明確になる(Aggregateは一部AXONのライブラリーをMockに差し替えればテストもしやすい)

Con

  • このチュートリアルでは、複数サービス横断のコマンドやイベントをcoreというプロジェクトに集めているが、この部分は、各サービスがcoreの実装に依存している。全サービスをJavaで作るなら問題ないが、そうでない場合には、ここの抽象度を高める工夫が要る
  • コマンドからイベントへのデータの詰め替えなどの操作が多く、冗長に感じる。

まとめ

実際に、チュートリアルで手を動かすことにより、実感することは多いと再認識しました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1