メインコンテンツへスキップ

マイクロサービス間の連携をシーケンス図で可視化する

🔗 はじめに

本記事では、マイクロサービスアーキテクチャにおける連携の流れをシーケンス図で表現する方法を解説します。

マイクロサービスは、それぞれが独立してデプロイ・スケール可能な小さなサービス群で構成されますが、ビジネスロジックを達成するにはサービス間連携が不可欠です。

ここでは、典型的な連携パターンをPlantUMLでモデル化し、視覚的に理解しやすくします。


🧩 典型的な連携シナリオの例

今回は以下のような典型的な3サービス構成を例にします:

  • API Gateway:クライアントとのフロント役

  • User Service:ユーザー情報の取得・管理

  • Order Service:注文処理を担当


🛠️ PlantUMLによるマイクロサービス連携のシーケンス図

以下は、「ユーザーが注文履歴を取得する」という処理の流れを示したシーケンス図です。

image.png

@startuml
actor Client
participant "API Gateway" as Gateway
participant "User Service" as User
participant "Order Service" as Order

Client -> Gateway: GET /orders
Gateway -> User: GET /user-info
User --> Gateway: user data

Gateway -> Order: GET /orders?userId=xxx
Order --> Gateway: order list

Gateway --> Client: order list with user info
@enduml

🔍 ポイント解説

  • クライアントからは1リクエストで完了

  • バックエンドではUserとOrderの2サービスが連携

  • Gatewayが集約役として中継・統合している


🔁 リトライ・障害・非同期処理を含めた例

次は、Order Serviceが混雑しており、リトライする場合の例です。

image.png

@startuml
Client -> Gateway: POST /order
Gateway -> Order: create order
loop Retry up to 3 times
  Order --> Gateway: 503 Service Unavailable
  Gateway -> Order: retry
end
Order --> Gateway: 201 Created
Gateway --> Client: Order confirmed
@enduml

リトライロジックやステータスコードの流れを明示することで、運用上の注意点が共有しやすくなります。


📡 非同期通信(Pub/SubやQueueベース)の表現

マイクロサービスでは非同期処理も頻繁に登場します。以下はメッセージキューを介した処理の一例です。

image.png

@startuml
actor Client
participant "API Gateway" as Gateway
participant "Queue (Kafka/SQS)" as Queue
participant "Billing Service" as Billing

Client -> Gateway: POST /payment
Gateway -> Queue: publish(payment info)

Queue -> Billing: consume(payment info)
Billing -> Billing: process payment
@enduml

🔍 ポイント

  • publishconsume の表現はあくまで概念的

  • 非同期処理であるため、戻り値のタイミングは図に含めない設計もあり


📌 よく使う構文の補足(マイクロサービス編)

記法 意味
loop リトライ処理やポーリングの表現に便利
alt / else 成功/失敗のフロー分岐
participant サービス名(必要に応じてエイリアスも)
note right 説明補足の挿入にも使える

🎁 おわりに

マイクロサービス連携をシーケンス図で整理することで、サービス間の依存関係、処理の責務、障害点を明確にすることができます。

PlantUMLはGitで管理できるため、仕様変更時の差分確認にも強く、ドキュメントの属人化を防ぐ手段としても非常に有効です。

次のステップとしては、SAGAパターン分散トランザクションの表現など、さらに高度なシナリオも扱ってみましょう!


必要であれば、この内容をベースに「エラーハンドリング特化」や「フロント~バック全体のエンドツーエンド図」などのバリエーションも作れますよ。どうしますか?