Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マイクロサービス設計に活⽤する DDDとEvent Storming / designing_microservices_with_DDD_and_EventStorming

マイクロサービス設計に活⽤する DDDとEvent Storming / designing_microservices_with_DDD_and_EventStorming

マイクロサービス設計に活⽤する DDDとEvent Storming
〜マイクロサービス化を選択する際の考慮点〜

福井 厚
シニアソリューションアーキテクト
Developerスペシャリスト - DevAx
アマゾンウェブサービスジャパン

Atsushi Fukui

February 16, 2024
Tweet

More Decks by Atsushi Fukui

Other Decks in Technology

Transcript

  1. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. マイクロサービス設計に活⽤する DDDとEvent Storming マイクロサービス化を選択する際の考慮点 Atsushi Fukui Senior Solutions Architect, Developer Specialist Amazon Web Services Japan
  2. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ⾃⼰紹介 v名前 v福井 厚(ふくい あつし)twitter: afukui@ v所属 vアマゾン ウェブ サービス ジャパン合同会社 vシニアソDeveloperスペシャリスト ソリューションアーキテクト - DevAx v関⼼領域 vソフトウェア アーキテクチャ、オブジェクト指向設計、アジャイル開発 v好きなAWSサービス vサーバーレステクノロジー全般、 AWS Code シリーズ
  3. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Agenda • マイクロサービスとは • なぜマイクロサービスアーキテクチャを採⽤するのか • Amazonが学んだこと • マイクロサービスのトレードオフ • どうやってサービスを分割するのか • ドメイン分割のためのEvent Storming • まとめ
  4. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. マイクロサービスとは
  5. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスとは • ビジネスドメインに基づいて分割された、独⽴してデプロイ可能なサービス 映画情報 サービス 料⾦サービス 通知サービス 予約サービス 発送サービス 課⾦サービス 料⾦情報の 問い合わせ 上映⽇イベント 予約情報 問い合わせ
  6. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスの性質 疎結合で、独⽴性が⾼い • 独⽴してデプロイ可能 • つまり各サービスが疎結合 • ビジネスモデルの境界に沿って分割 • Web 三層 ⇔ ドメインモデル • 技術的な境界に沿って分割しない • 変更要求に対し、複数のサービスを横断して デプロイすることになる • 各サービスが⾃⾝でデータを所有する • データベースを共有しない • データはWeb APIやイベントなどで受け渡す Sam Newman. モノリスからマイクロサービスへ
  7. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. なぜマイクロサービスアーキテクチャ を採⽤するのか
  8. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスの⽬的 チームの⾃律性 チームの規模が⼩さくなることでコミュニケーションコストが減る ⾃⾝のサービスを完全にコントロールでき、⾃律的⾃発的な機能改善に繋がる アジリティ 各機能を他の機能のリリースを調整せずにリリースできるようになる スケーリング 負荷が⾼い機能のみをスケーリングすることができる 堅牢性 負荷が⾼まったとき、リリースによる障害などの影響が単⼀のサービスにとどまり、アプリケー ション全体としての堅牢性が⾼まる 採⽤技術の柔軟性 各サービス毎に異なる⾔語やアーキテクチャ(VM/コンテナ/サーバーレス/etc)を採⽤できる
  9. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 『 』 “…innovation is now recognized as the single most important ingredient in any modern economy…” イノベーション こそが近代経済において最 も重要な要素と考えられている。 競合よりも早く、新しい波を 創っていくことが重要
  10. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. イノベーションがビジネスを進化させる 新たなマーケット 新たな顧客価値 New economics 新たなデジタル製品とサービス
  11. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Listen Idea Experiment Innovation Flywheel 実験がイノベーションを加速する
  12. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. マイクロサービスのトレードオフ
  13. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスのトレードオフ 分散システムに伴う複雑性 ネットワーク呼出による連携となり、モノリシックシステムでメ ソッドを呼び出すときには発⽣しなかった考慮点が発⽣する ネットワークのエラーや遅延、呼出先のダウン、障害発⽣時のトラ ブルシューティングなど 整合性の担保 モノリシックなシステムではトランザクションで容易に強⼒な整合 性を担保できる マイクロサービスで同様の整合性は担保できない マイクロサービスの統廃合やリファクタリングが困難 モノリスではIDEの機能で⾃動的にインターフェースやクラスの分割、 抽出、統合が可能で、データスキーマも整理可能 マイクロサービスでは、そのような統廃合は複数のサービスチーム の調整やデータの移管が必要
  14. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. トレードオフの対策 分散システムに伴う複雑性 ⾮同期なイベント駆動で連携したり、同期API呼出の場合はサー ビスメッシュを利⽤する 整合性の担保 整合性が必要な単位でマイクロサービスを分割しない どこで整合性が必要なのか、ビジネスのモデリングが必要 サーガパターンなど、結果整合性を担保するデザインパターンを 利⽤する マイクロサービスの統廃合やリファクタリングが困難 統廃合がなるべく発⽣しないよう、ビジネスのモデリングが必要
  15. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスが良い選択肢ではない場合 • ドメインが不明確 • サービスの境界を間違えるとコストがかかる可能性 • スタートアップ • マイクロサービスの複雑性が却って⾜枷に • COTS(市販品)ソフトウェア • 正当な理由がない • 「流⾏っているから」「他がやっているから」で始めるのは危険
  16. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. マイクロサービスに適した組織
  17. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスの組織とチームビルディング • ⾃律的で意思決定する権限と責任を持つチーム • 開発したチームが運⽤も⾏う(You build it, you run it) • Two Pizza Team • すべてを所有
  18. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 参考︓チームトポロジー ストリームアラインドチーム ストリームアラインドチーム ストリームアラインドチーム 共有サービスプラットフォームチーム 内部プラットフォームチーム ][ セキュリティ コミュニティ・オブ・ プラクティス(CoP) プラットフォーム + ツール )( )( フィールドチーム (サポート、ソリューションアーキテクト、営業) O 製品機能のリクエスト ストリームアラインドチーム ビジネスに沿った⽬標を持つチーム イネーブリングチーム ストリームアラインドチームが 障害を克服するのを⽀援。 コンプリケイテッド・ サブシステムチーム 専⾨性が必要な機能を担当する 専⾨スキルを持つチーム コラボレーション ファシリテーション O )( フェデレーションサービス (X-as-a-Service) ][ データ サイエン スチーム サービスとしてのプラットフォーム キー: )( )( ][ * マシュー・スケルトン,マニュエル・パイス. チームトポロジー 価値あるソフトウェアをすばやく届ける適応型組織設計 (Japanese Edition). Kindle Edition.
  19. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. どうやってサービスを分割するのか
  20. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. マイクロサービスの性質(再掲) 疎結合で、独⽴性が⾼い • 独⽴してデプロイ可能 • つまり各サービスが疎結合 • ビジネスモデルの境界に沿って分割 • Web 三層 ⇔ ドメインモデル • 技術的な境界に沿って分割しない • 変更要求に対し、複数のサービスを横断して デプロイすることになる • 各サービスが⾃⾝でデータを所有する • データベースを共有しない • データはWeb APIやイベントなどで受け渡す Sam Newman. モノリスからマイクロサービスへ
  21. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. ドメイン駆動設計によるサービスの 分割
  22. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ドメイン駆動設計 (Domain Driven Design, DDD) とは • ⾼品質なソフトウェアモデルを設計 するためのソフトウェア開発⼿法 • 設計における意思決定とドメイン 設計の議論における技術的な⽤語の広義 のフレームワークを提供 • ユビキタス⾔語 ー ビジネスドメイン エキスパートと開発者の間の意思疎通と して利⽤される⽤語によってモデリング と設計を⾏う • 戦略的な設計のためのガイドライン ー 境界づけられたコンテキスト、 蒸留、⼤規模な構造の考察
  23. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ドメイン駆動設計(DDD)とは 「DDDには戦略的モデリングと戦術的モデリングの両⽅の ためのツールが⽤意されており、業務要件を満たす⾼品質な ソフトウェアを設計するために、必要に応じて使える。」 ヴァーン・ヴァーノン. 実践ドメイン駆動設計 (Japanese Edition) (Kindle Locations 744-746). Kindle Edition.
  24. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. AWS Developer Live Show - 「ドメイン駆動設計のススメ」 24 https://go.aws/3Q2nNgl
  25. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. 戦略的DDDと戦術的DDD
  26. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 戦略的DDD 26 • 業務をモデリングする設計理論 業務 業務モデル 予約 航路 旅程 ユーザー モデリング • ユビキタス言語 • 境界づけられた コンテキスト • コンテキストマップ • ドメインビジョン • コアドメイン • 汎用サブドメイン • etc ..
  27. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 戦術的DDD 27 • モデリングされた業務をシステムに落とす • ユビキタス言語 • リポジトリ • 依存関係の逆転 • サービス • 値オブジェクト • エンティティ • ファクトリ • 集約 業務モデル 予約 航路 旅程 ユーザー 反映 システム
  28. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. DDDの戦略が解決するもの
  29. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 脆いシステムになる代表的な原因 29 • 言語の壁 • 不明瞭なコンテキスト 業務モデル 予約 航路 旅程 ユーザー
  30. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. モデリングを阻む⾔語の壁 30 if (code == 5) { person.setCode(6); } else if (sCode == 7) { system.set(CODE_9); } else if (sCode == 12) { new MySQL().insert("ERROR values (type1, 5)"); System.exit(); } 業務 内部 仕様書 これで合ってる?? ?? 開発者
  31. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. モデルという共通⾔語でコミュニケーション 31 業務 業務モデル 予約 航路 旅程 ユーザー モデリング if (route.enable(time)) { return new Reservation(user, route, time); } else { return new FalseReservation("the route cannot be used for the time"); } 反映 合ってそう / 違和感がある これで合ってる?? 開発者 ドメインエキスパート
  32. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ユビキタス⾔語 32 • 業務モデルで使⽤される、業務側も開発側も理解できる共通⾔語 • システムに関わる全ての場所で⼀貫してユビキタス⾔語が使われるべき • モデル、コード、仕様書、ドキュメント、etc.. • 共通⾔語がないと脆いシステムになりやすい • 業務モデルで利⽤されるチームで作り上げられた共通⾔語 業務モデル 予約 航路 旅程 ユーザー ドメインエキスパート 開発者 業務 if (route.enable(time)) { return new Reservation(user, route, time); } else { return new FalseReservation("the route cannot be used for the time"); }
  33. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. 戦略的DDDで適切にコンテキスト を分けユビキタス⾔語を構築する
  34. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 戦略的設計 • ビジネスドメインを理解する • 境界づけられたコンテキストからサブドメインを定義する • コンテキストマッピングを定義する
  35. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ビジネスドメインの理解 境界づけられたコンテキスト ユビキタス言語 コンテキストの外側 ドメインエキスパート
  36. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 境界づけられたコンテキストでサブドメインに分割 “ビジネスドメイン 全体の中の⼀部分” オークション ユーザー 認証 支払い 配送 在庫 通知 オークションビジネスドメイン
  37. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 境界づけられたコンテキスト • 境界づけられたコンテキストは特定の • モデルを適⽤できる限定された範囲。 • コンテキストの境界を定めることで、 • チームメンバーは何を⼀致させるべきで 何を独⽴して開発できるのかについての 理解を明確化し、共有できる。 https://www.martinfowler.com/bliki/BoundedContext.html Customer Ticket Product Product version Customer Product Territory Opportunity Pipeline Salesperson Defect Sales context Support context
  38. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. コンテキストマップ Sales context Support context Marketing context 境界つけられたコンテキストだけでは、ドメインの 全体像を⽰すことはできない。 コンテキストマップは、境界づけられたコンテキスト を統合することにより、異なるが関連するユビキタス ⾔語のマッピングを処理する。 DDDでは境界づけられたコンテキストを統合するため の7つのパターンを説明 • 共有カーネル (Shared Kernel) • 顧客/供給者の開発チーム (Customer/Supplier Development Teams) • 順応者 (Conformist) • 腐敗防⽌層 (Anticorruption layer) • 別々の道 (Separate ways) • 公開ホストサービス (Open/Host service) • 公表された⾔語 (Published language)
  39. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 境界づけられたコンテキストとドメインモデル 在庫 オークション 支払い 台車 ピッカー 配送サービス 倉庫 商品 棚位置 サイズ 重さ 配送顧客 配送先 入札 落札 商品 SKU 画像 価格 入札顧客 ID 検索サービス 落札顧客 クレジットカード 支払い
  40. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. データソースをサービスの所有ごとに分割 ⽀払い オークション 在庫 共有されている モノリシック データベース モノリシックシステム ⽀払い オークション 在庫 商品や顧客などもサービスによって利⽤する属性が 異なるので、それぞれのサービスの所有するデータ へ移⾏する。 データソースの移⾏計画も検討。 顧客マスタ 配送顧客 ⼊札顧客 ⽀払顧客
  41. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. Event Storming
  42. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. どうやって境界づけられた コンテキストを定義するの か
  43. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. ドメイン分割のための Event Storming
  44. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Event Stormingの概要 44 ⾼品質なモデリングのための 簡単なワークショップ (ワイワイやる感じの) 業務から、境界づけられた コンテキストとモデルを導き出す
  45. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Event Storming は以下のステップを繰り返す • Big Picture • Process Modeling • Software Design
  46. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Event Stormingの流れ - Big Picture • Eventの洗い出し、時系列化 • Pivotal Event (分割点になるEvent )をマーク • スイムレーン(並⾏処理、分岐点) の発⾒ • 関係者/外部システムを洗い出し • 上記完了後に、ナレーション/ ウォークスルー
  47. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Step5 - 関係者、外部システムの洗い出し ....
  48. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Event Stormingの流れ – Process Modeling • 洗い出したイベントをつなぎプロセスに § コマンド § ロール § リードモデル § ポリシー § システム § ホットスポット https://www.slideshare.net/ziobrando/software-design-as-a-cooperative-game-with-eventstorming/27
  49. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Step7 - アクターとポリシーの洗い出し ....
  50. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Event Stormingの流れ –Software Design • 集約を⾒つける、名前をつける • 境界づけられたコンテキストを⾒つける • 設計の詳細に⼊り、コーディングに進められるようにする
  51. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Step10 – 境界づけられたコンテキストを⾒つける ....
  52. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. 戦術的DDD
  53. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 戦術的設計 60 • 集約、値オブジェクト、エンティティー • ドメインイベント
  54. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 値オブジェクト • 構成要素の値によって識別されるオブジェクト • 識別⼦(ID)を必要としない • 例えば「⾊」値オブジェクト • イミュータブルで変更する 場合は全体を置き換え class Color { private _red:number; private _green:number; private _blue:number; constructor(red:number, green:number, blue:number){ this._red = red; this._green = green; this._blue = blue; } //...other methods }
  55. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. エンティティ • 明確な識別⼦(ID)を必要とする • エンティティーはライフサイクルを持つ • エンティティーは更新可能 • 例えばPersonエンティティ class Person { private _id:string; private _name:string; constructor(id:string, name:string){ this._id = id; this._name = name; } //... }
  56. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 集約 • 同⼀のトランザクション境界に属するエンティティと値オブジェク トの組み合わせ • 集約もエンティティなのでIDが必要 • 集約がトランザクションの単位 集約の ルート エンティティ 値オブジェクト エンティティ 1 0…* 1…* 1 ID
  57. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 例 – オークションの集約 64 オークション 競売参加者 オークション品 1 * 1 支払い方法 配送方法 * 1 1 1 集約ルート 在庫 1 1 競売人 1 1 *
  58. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 集約のルール • 集約はシンプルに⼩さく保つ • 集約の状態はパブリックインターフェイスでのみ変更可能 • 集約はトランザクション境界、集約の状態変更は アトミックな操作としてコミットする必要がある • 集約内のエンティティや値オブジェクトを表現する集約ルートを選 択
  59. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. モデル駆動設計を構成する⾔語のナビゲーションマップ モデル駆動 設計 サービス エンティティ 値オブジェクト ファクトリ 集約 リポジトリ 利⼝なUI モデルを表現するのに使⽤する モデルを表現するのに使⽤する モデルを表現するのに使⽤する 排他的な選択 アクセスするのに使⽤する 整合性を保つのに 使⽤する アクセスするのに使⽤する ルートとして機能する カプセル化するのに使⽤する カプセル化するのに 使⽤する カプセル化するのに使⽤する カプセル化するのに使⽤する レイヤ化 アーキテクチャ ドメインを隔離する のに使⽤する
  60. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 作成したモデルをコードに反映 • 戦術的DDD § ドメインモデルを実装に反映する § モデルと実装は繰り返し改善する § ドメインモデルがビジネスロジックに対する責務を持つ § ドメインモデルとインフラストラクチャを分離する – 依存関係逆転の原則により、ドメイン層をシステム的な関⼼ごとから分離 – ヘキサゴナル/オニオン/クリーンアーキテクチャ
  61. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. イベント駆動アーキテクチャの利⽤ • イベント駆動アーキテクチャについては、以下のシリーズを参照 • AWS DevAx::Connect シーズン1「イベント駆動」 • https://aws.amazon.com/jp/devax-connect-on-demand/
  62. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. 実装に向けた⾮機能要件へ の適⽤
  63. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ドメインモデル DDD-Event Storming AWS サービス Well-Architected の原 則 概念モデル 論理モデル 物理モデル 現在の課題 技術的な課題 非機能要件 システムデザイン パターン ベストプラクティス 境界づけられたコンテキスト コンテキストマップ 集約 論理アーキテクチャ システムコンポーネント ドメインコンポーネント システム構成要素 物理アーキテクチャ AWSサービス上の 意思決定 アーキテクチャの意思 決定を記録 ネットワークゾーン デプロイメント単位 ノード 機能説明 ドメインモデルから物理アーキテクチャへ
  64. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 論理アーキテクチャへのマッピング 品質特性 非機能要件 論理アーキテクチャ 性能効率性 スケーラビリティーの担保、スロットリング要件など (例)ピーク時 1,000リクエスト/秒のリクエスト APIゲートウェイコンポーネント セキュリティー IDプロバイダの要件、認可要件など。 (例)認証されたリクエストのみが認可された権限範 囲でAPIにアクセス可能 認証プロバイダコンポーネント 信頼性 可能性の要件、サービスの稼働率など。 (例)疎結合な連携で一部のAZで障害が発生してもサ ービスを継続 メッセージキューコンポーネント 保守性 障害発生の検知など (例)サービスにまたがるモニタリング、ロギング 集約ログコンポーネント、可視化 コンポーネント ... ... ...
  65. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 参考︓ソフトウェア品質モデル ISO/IEC 25010:2011(JISX 25010: 2013) ソフトウェアの品質モデル 「JIS X 25010:2013 システム及びソフトウェア製品の品質要求及び評価(SQuaRE)−システム及びソフトウェア品質モデル」より
  66. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 論理アーキテクチャから物理アーキテクチャへ • アーキテクチャの意思決定を記録する § なぜそのアーキテクチャを選択したのか • 付加価値を⽣まない重労働をクラウドのサービスにオフロードする § サーバーレスやマネージドサービスを活⽤ • デプロイメント単位を決定し頻繁にリリース可能にする § CI/CDによる⾃動化 • ⽇々の運⽤で知⾒を蓄え可観測性を⾼める § トレース、ログ、メトリクス、アラートの設定
  67. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 参考︓ヘキサゴナルアーキテクチャ Domain Model Ports Adapters Primary Actor Secondary Actor HTTP Request Event Message Queue … File Storage Database Queue …
  68. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 参考︓ヘキサゴナルアーキテクチャ Domain Model Ports Adapters Primary Actor Secondary Actor HTTP Request Event Message Queue … File Storage Database Queue … アプリケーションはポートによって接続される アダプタは外界との糊の役⽬を果たす ドメインモデルはビジネスロジックを実⾏し、モデルの外側 についての知識を持たない
  69. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. サンプルアーキテクチャ AWS Cloud Amazon API Gateway AWS Lambda Amazon DynamoDB User Internet
  70. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ドメインモデル、ポート、アダプターの構成 API Gateway Lambda関数 ドメインモデル Lambdaサービス アダプター アプリケーションサービス(ポート) アプリケーションサービス(ポート) アダプター アダプター アダプター データソースの 呼び出し
  71. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ドメインモデルクラス import { AuctionItem } from "./auction_item"; export class Auction { private auction_id: number; private auction_name: string; private auction_items: AuctionItem[]; // .... more members constructor(name: string, ...) { this.auction_name = name; //...initializing code } addAuctionItem(item: AuctionItem) { this.auction_items.push(item); //...more code } ドメインモデルで定義されたピュアなビジネス ロジックのみが実装される。 外部の世界に対する知識を持たない。
  72. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ポートクラス(アプリケーションサービス) import { Auction } from "./auction"; import { AuctionItem } from "./auction_item"; import { IAuctionAdapter } from "./i_auction_adapter"; import { IAuctionController } from "./i_auction_controller"; export class AuctionController implements IAuctionController { private auction: Auction; private auction_adapter: IAuctionAdapter; //... constructor(auction: Auction, auction_adapter: IAuctionAdapter) { this.auction = auction; this.auction_adapter = auction_adapter; //... } add_auction_items(items: AuctionItem[]) { //... ポートクラスがドメインモデルとアダプターの インスタンスを受け取り、ドメインモデルとア ダプターを呼び出す。
  73. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アダプタクラス import { Auction } from "./auction"; import { IAuctionAdapter } from "./i_auction_adapter"; export class AuctionAdapter implements IAuctionAdapter { store_auction(auction: Auction) { //ドメインモデルの永続化 //... } } アダプタークラスは外部サービスとの連携を担当 単体テスト時はダミークラスに差し替えてテストを 実行
  74. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 依存関係 <Domain Model> Auction <Port> AuctionController <Adapter> AuctionDBAdapter <interface> IAuctionAdapter <Adapter> DummyAdapter
  75. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. 参考︓ヘキサゴナルアーキテクチャのサンプルコード • ヘキサゴナルアーキテクチャを利⽤したLambda関数のドメインモデルの実装 Live § 動画︓ https://www.youtube.com/watch?v=whQ-P05QeDQ § 資料︓ https://pages.awscloud.com/rs/112-TZM-766/images/DEV- 09_LiveCoding_with_hexagonal_architecture.pdf • ヘキサゴナルアーキテクチャを利⽤した AWS Lambda のドメインモデル オブジェクトサンプルコード https://github.com/aws-samples/aws-lambda-domain-model-sample
  76. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. ストラングラーパターンに よる移⾏
  77. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ビッグバンでの移⾏はお勧めしません︕ 終わりが見えない 。。。 今から丸3年かけて 2026年9月に マイクロサービス化した 新システムを リリースするぞー! 会社の偉い人 現場の担当者
  78. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. ビジネスドメインに従ってサービスを分割し ストラングラーパターンで徐々に移⾏ • ストラングラーパターン • レガシーアプリケーションのさまざまな コンポーネントのイベントと API を徐々に 作成して、モノリシックアプリケーションを マイクロサービスに移行する
  79. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス Store Front ユーザー インターフェイス 直接カットオーバーせず、 ストラングラーパターンを使⽤して リスクを軽減 ストラングラーパターンでモノリスから移⾏ 共有されている モノリシック データベース レガシーシステム ブラウザ
  80. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス 新機能 サービス レガシーシステム ブラウザ API ストラングラーパターンでモノリスから移⾏
  81. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス ユーザー マイクロサービス ACL(Anti-corruption layer) は、 境界づけられたコンテキスト間で 通信するための手段として使用される。 ACLが1 つのコンテキストから 別のコンテキストへ翻訳するので、 各コンテキストのモデルは独立を保ち 自身の言葉づかいを反映することができる ACL レガシーシステム ブラウザ 新機能 サービス API ストラングラーパターンでモノリスから移⾏
  82. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス レガシーシステム クライアント ブラウザ ユーザー マイクロサービス 新機能 サービス API API ストラングラーパターンでモノリスから移⾏
  83. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス レガシーシステム クライアント ブラウザ サービスがSSoT(※)になる ※Single Source of Truth ユーザー マイクロサービス 新機能 サービス API API ストラングラーパターンでモノリスから移⾏
  84. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス レガシーシステム クライアント ブラウザ キュー/エージェントを使⽤して同期 ユーザー マイクロサービス 新機能 サービス API API ストラングラーパターンでモノリスから移⾏
  85. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス カート サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス レガシーシステム クライアント ブラウザ カート マイクロサービス ACL ユーザー マイクロサービス 新機能 サービス API API API ストラングラーパターンでモノリスから移⾏
  86. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. アカウント サービス ユーザー サービス 共有されている モノリシック データベース Store Front ユーザー インターフェイス レガシーシステム クライアント ブラウザ カート マイクロサービス ACL ユーザー マイクロサービス 新機能 サービス API API API アカウント マイクロサービス API ストラングラーパターンでモノリスから移⾏
  87. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. Store Front ユーザー インターフェイス ブラウザ カート マイクロサービス ユーザー マイクロサービス 新機能 サービス API API API アカウント マイクロサービス API ストラングラーパターンでモノリスから移⾏
  88. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. AWS Migration Hub リファクタリングスペース リファクタリング環境 の設定と管理 にかかる時間を短縮 AWS Migration Hub リファクタリングスペース アプリの利⽤者を インフラの変更から保護 複数の AWS アカウント間 でトラフィックを旧→新に 再ルーティングする アプリケーションのリファクタリングを数か⽉ではなく数⽇で開始する
  89. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. • Leave and layer 別の出発点を提供 • 古いアプリケーションに触れることなく、 マイクロサービスの新機能でアプリを強化、 または拡張する • 新しい機能をlaunchするか、最⼩限のリスク で迅速にビジネスを拡⼤する Strangler Fig は、チームの独⽴性と最新の アプリアーキテクチャを実現するのに役⽴つ • リファクタリングする最初の部分との インターフェースを定義する • 新しい機能を設計、実装、テストする • 古いものから新しいものにリダイレクト • 古いコードまたはサービスを停⽌する 段階的にリファクタリングする 新機能をすばやくlaunchする アプリ変換のための複数の リファクタリングパターン
  90. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. まとめ
  91. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. まとめ • マイクロサービスは変化に素早く対応し、フィードバックを得て改 善を重ねるビジネスにマッチしている • マイクロサービスにはトレードオフがあり、マイクロサービスに適 した組織にする必要がある • マイクロサービスは機能や技術スタックによる分割ではなく ドメインによる分割を⾏う • ドメイン分割にはドメイン駆動設計を活⽤する • ドメインエキスパートと開発者によるEvent Stormingによって 境界づけられたコンテキストとドメインモデルを定義し実装に反映 する
  92. マイクロサービス設計に活用する DDDとEVENT STORMING © 2023, Amazon Web Services, Inc. or

    its affiliates. © 2023, Amazon Web Services, Inc. or its affiliates. Thank you!