Microservices

定義の方法

1. システム操作の洗い出し

システム操作とは、アプリケーションが処理するリクエストを抽象化したもの。ドメインモデルに対するふるまいを定義する仕様。
ふるまいの定義とは、システム操作が呼び出されたときに満たすべき前条件と、操作終了後に満たさないとならない後条件。これらを定義するために、高水準のドメインモデルを定義する必要がある。

2. サービスの洗い出し

ビジネスに合わせて分割するサービスを定義する

  • 業務に合わせてサービスを定義する
  • [ドメイン駆動設計]のサブドメインとして定義
    サービスの分割に対するガイドライン⇛[サービスの分割]

3. サービスAPIと連携方法の定義

個々のサービスのAPIを定義する

  • システム操作のサービスへの割当
    • 基本的にはサービスに関係のあるシステム操作を割り当てる
    • システム操作が提供する情報を必要とするサービスに割り当てる
  • サービス間の連携
    • システム操作が満たすべき前条件と後条件を満たすように呼び出すサービスを決める

ただし、サービス間で連携する場合、下記に注意が必要

  • ネットワークのレイテンシ
  • サービス間の同期通信による可用性の低下

プロセス間通信

インタラクションスタイル

対応表

1対11対多
同期的リクエスト/レスポンス-
非同期的非同期リクエスト/レスポンスパブリッシュ/サブスクライブ
一方通行の通知パブリッシュ/非同期レスポンス
  • [同期的なリモープロシージャパターン]
    • リクエスト/レスポンス:同期的な通信。サービス間が密結合になる。
  • [非同期的メッセージングパターン]
    • 非同期リクエスト/レスポンス:リクエストしたクライアント側がレスポンスを待つブロックをしない状態
    • パブリッシュ/サブスクライブ:クライアントがメッセージをパブリッシュし、サブスクライブした0個以上のサービスがメッセージを消費する
    • パブリッシュ/非同期レスポンス:パブリッシュしたクライアントが特定のサービスからのレスポンスを待つ
    • 一方通行の通知:サービスにリクエストを送るが、レスポンスは期待しない

APIのバージョニング

セマンティックバージョニングを使うことで、互換性のないAPIの更新によって、利用しているサービスがダウンしないような設計を心がける。
セマンティックバージョニングに従うために、以下のような観点でバージョン番号を設定する。

  • Major:APIに互換性のない変更を加えるときにインクリメントする

    • HTTPベースの場合、パスにバージョンを組み込んだり、MIMEタイプにversionを含めることで互換性を保つ
  • Minor:APIに下位互換のある変更を加えるときにインクリメントする

    • 前提として、堅牢性の原則に従うようにすると下位互換のある変更であれば、古いバージョンのクライアントでも問題ない
    • リクエストにオプション属性の追加
    • レスポンスの属性の追加
    • 新しい操作の追加
  • Patch:下位互換性のあるバグフィックスをするときにインクリメントする

  • ECにおけるマイクロサービス分割を考察する