$30 off During Our Annual Pro Sale. View Details »

モノリスにおけるビジネスロジックの設計 ~アグリゲートパターン~ / aggregate-pattern-for-domain-modeling-on-monolithic

モノリスにおけるビジネスロジックの設計 ~アグリゲートパターン~ / aggregate-pattern-for-domain-modeling-on-monolithic

新規サービスをマイクロサービスで構築するのはアンチパターンと言われていますが、サービスが大きくなった時のことを考えるとサービス分割しやすい設計が求められます。
モノリシックな仕組みの中でサービス分割しやすい設計とするためにアグリゲートパターンを紹介します。

2020.7.6スライド修正:「集約についてDDD本に記載がない」という部分が誤りだったので訂正しています。

moomoo-ya

June 26, 2020
Tweet

More Decks by moomoo-ya

Other Decks in Programming

Transcript

  1. #ooltjp
    ©2020 RAKUS Co., Ltd.
    モノリスにおける
    ビジネスロジックの設計
    ~アグリゲートパターン~
    2020.6.26
    Isamu Suzuki

    View Slide

  2. #ooltjp
    鈴木 勇 @moomooya
    ● 株式会社ラクス
    ● ガンプラ部部長(社内サークル)
    ● かつて勉強会レポート最速おじさんでした
    ● Javaの人でしたが、最近はJavaScript, Python, TypeScript
    ● 趣味でゲームデザイナー
    ○ 代表作は「5分で要件定義 Fat Project」

    View Slide

  3. #ooltjp
    オブジェクト指向と
    現代的なアーキテクチャ設計というと

    View Slide

  4. #ooltjp
    マイクロサービスアーキテクチャ

    切っても切れない関係

    View Slide

  5. #ooltjp
    でも

    View Slide

  6. #ooltjp
    新規サービスを
    マイクロサービスで作るのは
    アンチパターン

    View Slide

  7. #ooltjp
    立ち上げ時に必要な
    開発速度が上がらない

    View Slide

  8. #ooltjp
    でも大きくなってしまうと
    サービス分割が難しい

    View Slide

  9. #ooltjp
    どうしたらいいの!?

    View Slide

  10. #ooltjp
    DDD(オブジェクト指向原理主義)
    の中に答えはあった

    View Slide

  11. #ooltjp
    アグリゲート(集約)パターン

    View Slide

  12. #ooltjp

    View Slide

  13. #ooltjp
    アグリゲート(集約)は
    原典では記載されていない
    実践(Implementing)を経て
    生まれたパターン
    嘘でした。
    DDD本第6章にも
    ガッツリ解説されて
    いました。

    View Slide

  14. #ooltjp
    アグリゲート(集約)とは?

    View Slide

  15. #ooltjp
    ドメインモデルをまとめたもの

    View Slide

  16. #ooltjp
    ドメインモデルをまとめたもの
    わからん

    View Slide

  17. #ooltjp
    ドメインの操作単位を
    まとめたもの

    View Slide

  18. #ooltjp
    ドメインの操作単位を
    まとめたもの

    View Slide

  19. #ooltjp
    店舗情報アグリゲート
    顧客アグリゲート
    注文アグリゲート
    注文
    配達先
    支払情報
    注文商品
    配達先
    支払情報
    顧客
    店舗情報
    「とあるレストランのドメインモデル」(第 5章参照)

    View Slide

  20. #ooltjp
    注文アグリゲート
    店舗情報アグリゲート
    顧客アグリゲート
    注文
    配達先
    支払情報
    注文商品
    配達先
    支払情報
    顧客
    店舗情報
    「とあるレストランのドメインモデル」(第 5章参照)
    ・ルートとなるドメインが操作を受付
    ・アグリゲート内の整合性を担保する

    View Slide

  21. #ooltjp
    店舗情報アグリゲート
    顧客アグリゲート
    注文アグリゲート
    注文
    配達先
    支払情報
    注文商品
    配達先
    支払情報
    顧客
    店舗情報
    「とあるレストランのドメインモデル」(第 5章参照)
    正規化されていない
      ↓

    アグリゲート単位で整合性を保つため

    View Slide

  22. #ooltjp
    店舗情報アグリゲート
    顧客アグリゲート
    注文アグリゲート
    <アグリゲートルート>
    注文 配達先
    支払情報
    注文商品
    配達先
    支払情報
    <アグリゲートルート>
    顧客
    <アグリゲートルート>
    店舗情報
    アグリゲートルート
    値オブジェクト
    アグリゲート

    View Slide

  23. #ooltjp
    アグリゲートパターンの要素
    ● アグリゲート
    ○ 操作単位をまとめたもの
    ● アグリゲートルート
    ○ アグリゲートの窓口
    ○ 外部からの操作を受け付ける
    ● 値オブジェクト
    ○ 業務知識の観点で説明的な型のオブジェクト
    ■ 「String型」ではなく「氏名型」であること

    View Slide

  24. #ooltjp
    この時点では
    モノリシックなので
    ドメイン境界ミスってても取り
    返しがつく(多分)

    View Slide

  25. #ooltjp
    サービス分割

    View Slide

  26. #ooltjp
    店舗情報アグリゲート
    顧客アグリゲート
    注文アグリゲート
    <アグリゲートルート>
    注文 配達先
    支払情報
    注文商品
    配達先
    支払情報
    <アグリゲートルート>
    顧客
    <アグリゲートルート>
    店舗情報
    アグリゲートルート
    値オブジェクト
    アグリゲート

    View Slide

  27. #ooltjp
    店舗情報サービス
    顧客サービス
    注文サービス
    <アグリゲートルート>
    注文 配達先
    支払情報
    注文商品
    配達先
    支払情報
    <アグリゲートルート>
    顧客
    <アグリゲートルート>
    店舗情報
    アグリゲートルート
    値オブジェクト
    サービス

    View Slide

  28. #ooltjp
    元々サービス分割の手法
    なのでそのまま分割
    (多分)

    View Slide

  29. #ooltjp
    サービス間のトランザク
    ションはSagaパターンなど
    で対応
    「サーガによるトランザクションの管理」(第 4章参照)

    View Slide

  30. #ooltjp
    きっとハッピーになれるはず

    View Slide

  31. #ooltjp
    以上
    Think ☺ you!!

    View Slide