サービス分割 — 現在・計画・移行途中
同じシステムを 3 回: 1 つのアプリケーションと共有 DB の中の請求、専用 DB を持つ独立した請求サービス、そして @migration_target / @planned で表す移行途中の状態。
現在(index.krs)
Section titled “現在(index.krs)”// service-split/index.krs: 現在のアーキテクチャ。// 初回体験ガイド(#3563)の題材。planned.krs(目標)と migrating.krs// (移行途中)と見比べる。//// 注文と請求は別のドメインだが、どちらも 1 つの Commerce Application に// 同居し、1 つの Commerce Database を共有している。請求チームは請求ドメインを// 持つが、サービスは 1 つも持っていない。
system Commerce { label "コマースプラットフォーム"
user Customer [human] { label "顧客" description "注文して支払う" } user FinanceStaff [human] { label "経理担当" description "請求書と返金を確認する" }
service CommerceApp { label "コマースアプリケーション" description "注文と請求を抱える 1 つのデプロイ単位"
domain Ordering { label "注文" usecase PlaceOrder { label "注文する" resource CommerceDB.Orders { operations create } } usecase TrackOrder { label "注文を追跡する" resource CommerceDB.Orders { operations read } }
Ordering -> Billing "請求書を依頼" } domain Billing { label "請求" usecase IssueInvoice { label "請求書を発行する" resource CommerceDB.Invoices { operations create } resource CommerceDB.Orders { operations read } } usecase CapturePayment { label "決済を確定する" resource CommerceDB.Payments { operations create } } } }
service InventoryWorker { label "在庫ワーカー" description "在庫の引当と解放をバックグラウンドで行う"
domain Inventory { label "在庫" usecase ReserveStock { label "在庫を引き当てる" resource CommerceDB.Stock { operations update } } } }
service PaymentGateway [external] { label "決済ゲートウェイ" description "外部事業者が運営するカード決済" }
database CommerceDB { label "コマースDB" description "プラットフォーム全体で共有" table Orders { label "注文" } table Invoices { label "請求書" } table Payments { label "決済" } table Stock { label "在庫" } }
Customer -> CommerceApp "注文・支払い" FinanceStaff -> CommerceApp "請求書を確認" CommerceApp -> InventoryWorker "在庫を引当" CommerceApp -> PaymentGateway "決済を確定"}
organization Shop { label "ショップ開発部"
team commerce { label "コマースチーム" description "ストアフロントと注文フローを作る" owns CommerceApp owns Ordering }
team billing { label "請求チーム" description "請求ルールを持つが、出荷先はコマースアプリケーションの中" owns Billing }
team platform { label "プラットフォームチーム" description "共有データベースとバックグラウンドワーカーを運用する" owns InventoryWorker owns Inventory }}計画(planned.krs)
Section titled “計画(planned.krs)”// service-split/planned.krs: 目標のアーキテクチャ。// 請求は専用のデータベースを持つ独立したサービスとして動き、// 請求ルールを持つチームがそれを動かすサービスも持つ。// index.krs(現在のアーキテクチャ)と見比べる。
system Commerce { label "コマースプラットフォーム"
user Customer [human] { label "顧客" description "注文して支払う" } user FinanceStaff [human] { label "経理担当" description "請求書と返金を確認する" }
service CommerceApp { label "コマースアプリケーション" description "ストアフロントと注文"
domain Ordering { label "注文" usecase PlaceOrder { label "注文する" resource CommerceDB.Orders { operations create } } usecase TrackOrder { label "注文を追跡する" resource CommerceDB.Orders { operations read } } } }
service BillingService { label "請求サービス" description "請求書と決済。独自のリリースサイクル"
domain Billing { label "請求" usecase IssueInvoice { label "請求書を発行する" resource BillingDB.Invoices { operations create } } usecase CapturePayment { label "決済を確定する" resource BillingDB.Payments { operations create } } } }
service InventoryWorker { label "在庫ワーカー" description "在庫の引当と解放をバックグラウンドで行う"
domain Inventory { label "在庫" usecase ReserveStock { label "在庫を引き当てる" resource CommerceDB.Stock { operations update } } } }
service PaymentGateway [external] { label "決済ゲートウェイ" description "外部事業者が運営するカード決済" }
database CommerceDB { label "コマースDB" description "注文と在庫" table Orders { label "注文" } table Stock { label "在庫" } }
database BillingDB { label "請求DB" description "請求だけが持つ" table Invoices { label "請求書" } table Payments { label "決済" } }
Customer -> CommerceApp "注文" Customer -> BillingService "支払い" FinanceStaff -> BillingService "請求書を確認" CommerceApp -> BillingService "請求書を依頼" CommerceApp -> InventoryWorker "在庫を引当" BillingService -> PaymentGateway "決済を確定"}
organization Shop { label "ショップ開発部"
team commerce { label "コマースチーム" description "ストアフロントと注文フローを作る" owns CommerceApp owns Ordering }
team billing { label "請求チーム" description "請求ルールと、それを動かすサービスを持つ" owns BillingService owns Billing }
team platform { label "プラットフォームチーム" description "共有データベースとバックグラウンドワーカーを運用する" owns InventoryWorker owns Inventory }}移行途中(migrating.krs)
Section titled “移行途中(migrating.krs)”// service-split/migrating.krs: 移行途中の状態。// Billing Service は動いているが、まだ共有の Commerce Database を読み書き// している。専用の Billing Database は計画のみで、まだ無い。// データの移動が、分割の完了を決めるステップになる。
system Commerce { label "コマースプラットフォーム"
user Customer [human] { label "顧客" description "注文して支払う" } user FinanceStaff [human] { label "経理担当" description "請求書と返金を確認する" }
service CommerceApp { label "コマースアプリケーション" description "ストアフロントと注文"
domain Ordering { label "注文" usecase PlaceOrder { label "注文する" resource CommerceDB.Orders { operations create } } usecase TrackOrder { label "注文を追跡する" resource CommerceDB.Orders { operations read } } } }
service BillingService @migration_target(from: CommerceApp) { label "請求サービス" description "切り出し済み。まだ共有 DB を使う"
domain Billing { label "請求" usecase IssueInvoice { label "請求書を発行する" resource CommerceDB.Invoices { operations create } resource CommerceDB.Orders { operations read } } usecase CapturePayment { label "決済を確定する" resource CommerceDB.Payments { operations create } } } }
service InventoryWorker { label "在庫ワーカー" description "在庫の引当と解放をバックグラウンドで行う"
domain Inventory { label "在庫" usecase ReserveStock { label "在庫を引き当てる" resource CommerceDB.Stock { operations update } } } }
service PaymentGateway [external] { label "決済ゲートウェイ" description "外部事業者が運営するカード決済" }
database CommerceDB { label "コマースDB" description "請求のテーブルはまだ移っていない" table Orders { label "注文" } table Invoices @deprecated { label "請求書" } table Payments @deprecated { label "決済" } table Stock { label "在庫" } }
database BillingDB @planned { label "請求DB" description "請求のテーブルの移動先" table Invoices { label "請求書" } table Payments { label "決済" } }
Customer -> CommerceApp "注文" Customer -> BillingService "支払い" FinanceStaff -> BillingService "請求書を確認" CommerceApp -> BillingService "請求書を依頼" CommerceApp -> InventoryWorker "在庫を引当" BillingService -> PaymentGateway "決済を確定"}
organization Shop { label "ショップ開発部"
team commerce { label "コマースチーム" description "ストアフロントと注文フローを作る" owns CommerceApp owns Ordering }
team billing { label "請求チーム" description "請求サービスを運用。データ移行まではデータをプラットフォームチームに頼る" owns BillingService owns Billing }
team platform { label "プラットフォームチーム" description "共有データベースとバックグラウンドワーカーを運用する" owns InventoryWorker owns Inventory }}© 2026 Hiroki Kondo · Licensed underApache-2.0