DB@マイクロサービスアーキテクチャ¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. DBのデザインパターン¶
共有DBパターン¶
▼ 共有DBパターンとは¶
各マイクロサービスで共有するDBを1
個だけ用意する。
この場合、単一のDB上で、スキーマやテーブルをマイクロサービスごとに作成する必要がある。
▼ マイクロサービス別のスキーマ¶
共有DBの場合に、マイクロサービス別にスキーマを作成する。
▼ マイクロサービス別のテーブル¶
共有DBの場合に、マイクロサービス別にテーブルを作成する。
マイクロサービス別DBパターン¶
▼ マイクロサービス別DBパターンとは¶
各マイクロサービスで個別にDBを用意する。
ローカルトランザクションや分散トランザクションを実施する必要がある。
02. マイクロサービス別DBパターンの場合¶
ローカルトランザクション¶
▼ ローカルトランザクションとは¶
1
個のトランザクション処理によって、1
個のマイクロサービスのDBを操作する。
推奨される。
ダウンストリーム側マイクロサービスでのトランザクションを、イベントととして、アップストリーム側に伝える。
マイクロサービスアーキテクチャでローカルトランザクションを使用する場合、これを連続的に実行する仕組みが必要になる。
また、これらの各DBに対する各トランザクションを紐付けられるように、トランザクションにID (例:UUID) を割り当てる必要がある。
▼ ローカルトランザクションの種類¶
デザインパターンとして、Sagaパターン、TCCパターン、などがある。
グローバルトランザクション (分散トランザクション)¶
▼ グローバルトランザクションとは¶
分散トランザクションとも言う。
1
個のトランザクション処理によって、複数のマイクロサービスのDBを操作する。
非推奨である。
02-02. ローカルトランザクションの種類¶
Sagaパターン¶
▼ Sagaパターンとは¶
複数のローカルトランザクションを非同期通信で連続的に実行する。
ダウンストリーム側マイクロサービスのローカルトランザクションの完了をイベントとして、アップストリーム側マイクロサービスのDB処理を連続的にコールしていく。
ロールバックの代わりに、補償トランザクションという仕組みを実装する必要がある。
補償トランザクションでは、いずれかのローカルトランザクションが失敗した時に、それ以前の各ローカルトランザクションの実行結果を元に戻すような逆順のクエリ処理が実行される。
▼ 補償トランザクション¶
ローカルトランザクションを逆順に実行し、Sagaパターンによるトランザクションの結果を元に戻す仕組みのこと。
*例*
受注に関するトランザクションが異なるマイクロサービスにまたがる例。
補償トランザクションによって、各ローカルトランザクションを元に戻す逆順のクエリ処理が実行される。
オーケストレーション¶
▼ オーケストレーションとは¶
Sagaパターンにて、一連のローカルトランザクションの実行をまとめて制御する責務を持ったオーケストレーターサービス (コーディネーター) を配置する。
1
個のリクエストが送信された時に、オーケストレーションプログラムは各マイクロサービスをコールしながら処理の結果を繋いでいく。
マイクロサービスアーキテクチャのみでなく、サービス指向アーキテクチャでも使用される。
オーケストレーションが推奨である。
- https://blogs.itmedia.co.jp/itsolutionjuku/2019/08/post_729.html
- https://news.mynavi.jp/itsearch/article/devsoft/1598
- https://medium.com/google-cloud-jp/gcp-saga-microservice-7c03a16a7f9d
- https://www.fiorano.com/jp/blog/integration/integration-architecture/%E3%82%B3%E3%83%AC%E3%82%AA%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3-vs-%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/
▼ ローカルトランザクションの連携方式¶
マイクロサービス間のローカルトランザクションの連携方式として、メッセージキューを使用する。
各マイクロサービスがイベントのパブリッシュとサブスクライブを実行する。
各マイクロサービスは、自身の次に実行されるマイクロサービスを知らない。
各マイクロサービスは、処理結果をオーケストレーターサービスに返却する。
Choreography (コレオグラフィ)¶
▼ コレオグラフィとは¶
Sagaパターンにて、各マイクロサービスでアップストリーム側マイクロサービスに連携する責務を持たせ、ローカルトランザクションを連続的に実行する。
1
個のリクエストが送信された時に、マイクロサービスからマイクロサービスに処理が繋がっていく。
- https://blogs.itmedia.co.jp/itsolutionjuku/2019/08/post_729.html
- https://zenn.dev/yoshii0110/articles/74dfcf4132a805
- https://www.fiorano.com/jp/blog/integration/integration-architecture/%E3%82%B3%E3%83%AC%E3%82%AA%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3-vs-%E3%82%AA%E3%83%BC%E3%82%B1%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/
*実装例*
以下のリポジトリを参考にせよ。
▼ ローカルトランザクションの連携方式¶
マイクロサービス間のローカルトランザクションの連携方式として、メッセージキューを使用する。
各マイクロサービスがイベントのパブリッシュとサブスクライブを実行する。
各マイクロサービスは、自身の次に実行されるマイクロサービスを知っている。
各マイクロサービスは、次のマイクロサービスにイベントを渡せる別のキューに処理結果を返却する。
03. オブジェクトモデリング方式¶
イベントソーシング¶
▼ イベントソーシングとは¶
ビジネスの出来事をモデリングし、データとして永続化する。
現在の状態を取得する場合は、初期のデータに全ての出来事を適用する。
CQRSと相性が良い。
ステートソーシング¶
▼ ステートソーシングとは¶
ビジネスの現在の状態をモデリングし、データとして永続化する。
過去の状態は上書きされる。