Open16

【読書メモ】マイクロサービスアーキテクチャ 第2版

aa

2章 マイクロサービスのモデル化

aa

マイクロサービスの境界線を引くための基本概念

情報隠蔽

あるモジュールが別のモジュールを呼び出す際に、必要な仮定が少ければ少ないほど、呼び出されるモジュールは変更しやすくなる。できるだけモジュールの内部の情報を理解せずとも他のモジュールから簡単に呼び出せるようにしておこうみたいなこと。

凝集

「一緒に変更され、一緒に存在するコード」
変更箇所が1箇所にまとまっていた方が素早い変更とデリバリーが可能になる。

結合

aa

結合の種類

  1. ドメイン結合
  2. パススルー結合
  3. 共通結合
  4. 内部結合

ドメイン結合

パススルー結合

あるマイクロサービスが、他のマイクロサービスのさらに下流のマイクロサービスでデータが必要という理由だけで、データを渡す構造。マイクロサービスの構造がパスのようになっている。

Order -> Warehouse -> Shippingのような構造。

パススルー結合の問題は、下流のマイクロサービスで必要なデータが変更された場合、上流で複数のサービスを変更しなければならないこと。

共通結合

内部結合

aa

4章 マイクロサービスの通信スタイル

aa

マイクロサービスの通信スタイル

  • 同期ブロッキング
  • 非同期非ブロッキング
    • リクエスト/レスポンス
    • イベント駆動
    • 共通データ
aa

同期ブロッキング

あるマイクロサービスが、下流マイクロサービスを呼び出し、レスポンスが返ってくるまで処理をブロックする通信スタイル。

メリット

  • わかりやすい
  • 下流マイクロサービスのデータをすぐに使うことができる
  • エラーが発生した時に何らかの再試行を実行しやすい

デメリット

  • 時間的結合がある
  • 下流マイクロサービスの処理が遅い場合、長い時間処理がブロックされる
  • 長いパススルー結合などにおいては、複数の上流マイクロサービスにおいて処理がブロックされ、ネットワークが開いたままになってしまう
aa

非同期非ブロッキング

あるマイクロサービスが、下流マイクロサービスを非同期に呼び出し、呼び出し元のマイクロサービスは処理をブロックしない通信スタイル。

メリット

  • 時間的結合がない
  • 呼び出す下流マイクロサービスが重い処理でも、呼び出し元は次の処理を続けることができる

デメリット

  • むずい
  • 選択肢が多い
  • 下流マイクロサービスのデータを即時に使うことができない
aa

非同期非ブロッキング(共通データを介した通信)

あるマイクロサービスが、指定された場所にデータを設置し、その後のある時点で別のマイクロサービスがそのデータを取りに行く通信スタイル。

一般的に、データを取りに行くマイクロサービスは、何らかのトリガーや定期ジョブによってプロセスを実行する。

メリット

  • 実装が簡単(RDBやファイルシステムが使えればできる)

デメリット

  • 低遅延が求められるユースケースには向いていない
  • 共通結合を生み出すため、データ構造の変化に対応しにくい
aa

非同期非ブロッキング(リクエスト/レスポンス通信)

あるマイクロサービスが、下流マイクロサービスにリクエストを送信し、レスポンスを受信することを期待する通信スタイル。

同期ブロッキングでも実装することができる。

キューを使った実装

リクエストをバッファリングするキューと、レスポンスをバッファリングするキューを作成する。こうすることで、複数のリクエストをバッファリングし、処理を待たせることが可能になる。リクエストを十分に早く処理できないような場面で効果を発揮する。

aa

非同期非ブロッキング(イベント駆動通信)

あるマイクロサービスが、イベントを発行し、メッセージブローカーにに送信。他のマイクロサービスがメッセージブローカーから情報を取得し、処理をする通信スタイル。

イベントを発行するマイクロサービスはそのイベントが処理されるかどうかを知らないことがミソ。

リクエスト/レスポンスと違うのは、下流マイクロサービスのデータを呼び出し元が使う必要があるかどうかってとこな気がするなあ。

aa

6章 ワークフロー

aa

マイクロサービスでは原子性が失われることがある

顧客テーブルの顧客AのStatusをPendingからVerifiedに変更し、登録保留テーブルから顧客Aを削除するというトランザクションを実行したい。
このトランザクションは、顧客テーブルと登録保留テーブルが単一のデータベースであれば問題なく実行できるが、それぞれが別のデータベースにある場合、原子性が失われてしまう。