SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
2019年5月11日
ヤフー株式会社
三石 広樹
ドメイン駆動設計と
マイクロサービス
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
自己紹介
2
三石 広樹
• 2015/04 NTTグループ会社 入社
• 音響処理ライブラリ開発
• VRアプリ開発
• IoT基盤開発
• 2018/04 Yahoo! JAPAN 入社
• PF開発 ← 現在
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ドメイン駆動設計とマイクロサービス
3
本日の内容
1. ハマらないマイクロサービス
2. ドメイン駆動設計で切り込む
3. システムを変えていく
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ハマらない
マイクロサービス
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
システム説明
5
○×△
ポイントプレゼント!
ポイント
プレゼント!
コンテンツ表示
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
入稿システム
6
ページ
シナリオ
条件
コンテンツグループ
コンテンツ
ページ指定、パラメータ
コンテンツ
入稿担当入稿ツール
入稿システム
ポイント
プレゼント︕
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
開発のモチベーション
7
エンジニア育成
マイクロサービス
モダンなシステムを目指して開発
The Twelve Factors
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
データモデル
8
シナリオ情報ページ情報
コンテンツ情報
ページ シナリオ
コンテンツ
グループ
コンテンツ 条件
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
サービス構成
9・・・マイクロサービス?
ページ コンテンツ コンテンツ
グループ
コンテンツ
グループ
コンテンツ
グループ
シナリオ 条件
ページ
テーブル
コンテンツ
テーブル
コンテンツグループ
テーブル
シナリオ
テーブル
条件
テーブル
バリデート
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
サービス構成
10
ページ コンテンツ コンテンツ
グループ
コンテンツ
グループ
コンテンツ
グループ
シナリオ 条件
ページ
テーブル
コンテンツ
テーブル
コンテンツグループ
テーブル
シナリオ
テーブル
条件
テーブル
バリデート
ページ
パッケージ
シナリオ
パッケージ
コンテンツ
パッケージ
バリデート
パッケージ
まるでモノリシックなシステム
のパッケージのような・・・
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
システムが抱えた課題
11
変化に弱い
• 改修範囲が広い
• 改修箇所の特定が困難
• デプロイが複雑
開発チーム
コンテンツのバリデーション
ルール変更して!
レガシー化
企画
ページ コンテンツ
コンテンツ
グループ
コンテンツ
グループ
コンテンツ
グループシナリオ 条件
ページ
テーブル
コンテンツ
テーブル
コンテンツグループ
テーブル
シナリオ
テーブル
条件
テーブル
バリデート?
?
? ? ?
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
なにかの「考え」が足りていない
12
ビジネスとサービスの不一致
ビジネスとサービスの不一致
ビジネスとサービスの不一致
ビジネスとサービスの不一致
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ドメイン駆動設計で
切り込む
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ドメイン駆動設計で切り込む
モチベーション
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モチベーション
15
• 改修範囲が広い
• 改修箇所の特定が困難
• デプロイが複雑
マイクロサービスの切り方がよくない
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モチベーション
16
マイクロサービス化の指標がほしい
ドメイン駆動設計の
発想・手法に着目
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ひとつのマイクロサービスで
ひとつのドメインの問題を解決
モチベーション
17
ソフトウェアは
ビジネス課題(ドメイン)を解決する
ために在る
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
これまでの設計
18
商品管理
API
注文管理
API
1. データ設計をして 2. Web APIに切り分ける
機能単位
で分割
請求金額
配送先
…
在庫数
…
…
注文
商品
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
配送
これからの設計
19
商品API 経理API配送API
1. モデリングをして 2. Web APIに切り分ける
コンテキストの境界を探る
集約を見つける
ドメイン
で分割
配送先
…
…
…
…
…
請求金額
…
…
注文(配送)
商品 注文(経理)
経理
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
これからの設計
20
モデル(ビジネス視点)をベースに
システムを考える
データ(技術視点)をベースに
システムを考える
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ドメイン駆動設計で切り込む
現場で実践
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
新しい案件
22
コンテンツを一括作成できるツールがほしい。
• 共通項目とコンテンツ毎の項目がある。
• 入稿システムとのデータ連携が要る。
• 入力項目をテンプレから選べるようにする。企画
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
新しい案件
23
共通項目
個別項目1
ショッピングページページ
1000pプレゼント文言
500pプレゼント文言
http://hoge.com遷移先
テンプレAテンプレ
http://fuga.com遷移先
個別項目2
コンテンツ1kp
• ページ:ショッピングページ
• 文言 :1000pプレゼント
• 遷移先:http://hoge.com
コンテンツ500p
• ページ:ショッピングページ
• 文言 :500pプレゼント
• 遷移先:http://fuga.com
作成
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
入稿システム
新しい案件
24
? ??
データ連携
新規システム
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ドメイン駆動設計をはじめよう
25
ドメインをモデリングしよう!!
ドメイン駆動設計
試したい
!?
自分
チームメンバ
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モデリング
26
ユーザはなににどんな関心が
あるのか?
関心事をモデリング(設計)しよう
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モデリング
27
共通項目
コンテンツ
入力値
個別項目
テンプレート
入力項目
1. モデルを洗い出す
共通項目
入力値
コンテンツテンプレート
入力項目
2. 関係を整理する
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モデリング
28
共通項目
コンテンツ
入力値
テンプレート
入力項目
3. なにか違和感
コンテンツ
セット
共通項目
コンテンツ
入力値
テンプレート
入力項目
4. 新しい関心事が見えた
コンテンツセット
と共有項目がある
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モデリング
29
表面化していないモデルを定義した
• まだ曖昧なモデルを見つけた
• これから必要になると予想した
ビジネスも常に成長途中
エンジニアがモデル明確化をフォロー
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モデリング
30
コンテンツ
入力値
テンプレート
入力項目
集約とコンテキスト
コンテンツ
セット
共通項目
コンテンツセット
コンテキスト
テンプレート
コンテキスト
コンテンツ
セット
テンプレート
コンテンツセットを集約として
登録・更新・閲覧・削除ができる
テンプレートを集約として
登録・更新・閲覧・削除ができる
APIに分割
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
モデリング
31
集約をユースケースから考えた
• ユーザの操作対象がなにかを追求した
• 操作する単位をビジネスサイドと議論
ビジネス視点で考えて
ドメインを操作したい単位を見極める
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
入稿システム
新規システム
32
コンテンツ
セット
テンプレートマッピング
入稿コンテキスト コンテンツコンテキスト
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 33
クリーンアーキテクチャ
REST API パッケージ構成
出典:The Clean Code Blog by Robert C. Martin (Uncle Bob)
http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Interface
• Controller
Application
• Use Case
Domain
• Model
• Repository
• Service
Infrastructure
• Repository/Persistence
DIP
依存性逆転
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
ドメイン駆動設計で切り込む
実践を終えて
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
得られたメリット
35
• 改修範囲が広い
• 改修箇所の特定が困難
• デプロイが複雑
ビジネスとサービスの単位一致により局
所化
クリーンアーキテクチャで明確化
変更のあったサービスだけのリリース
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
得られたメリット
36
考慮漏れ
リファクタ
機能追加
仕様変更
ドメイン駆動設計が守る
コンテンツ
セット
テンプレートマッピング
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
気付いた難しさ
37
チーム
技術
• ドメイン駆動設計の理解を得難い
• 複数チームだと難しい
• 初期実装コストが高い
• ドメインを守ることが大変
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
これから守りたいポイント
38
モデリングとサービス分割
実装は後でリファクタリングできるけど
サービスの分離は容易でない
最初のシステム設計が肝心
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
システムを変えていく
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
既存システム再構築計画
40
ドメイン駆動
設計後の姿?
①
② ③
段階を踏んで理想の姿へ
ページ コンテンツ
コンテンツ
グループ
コンテンツ
グループ
コンテンツ
グループシナリオ 条件
ページ
テーブル
コンテンツ
テーブル
コンテンツグループ
テーブル
シナリオ
テーブル
条件
テーブル
バリデート
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
変化
未来のために
41
この壁を壊すのはエンジニア
コンテンツ
セット
テンプレートマッピング
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
変化
未来のために
42
この壁を築くのもエンジニア
コンテンツ
セット
テンプレートマッピング
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.
未来のために
43
次のレガシーを残さない
Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 44
EOF

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
マイクロサービス化に向けて
マイクロサービス化に向けてマイクロサービス化に向けて
マイクロサービス化に向けて
 
ウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説するウェブセキュリティのありがちな誤解を解説する
ウェブセキュリティのありがちな誤解を解説する
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
JIRAを使った簡単リリースプランニング
JIRAを使った簡単リリースプランニングJIRAを使った簡単リリースプランニング
JIRAを使った簡単リリースプランニング
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
30分でわかるマイクロサービスアーキテクチャ 第2版
30分でわかるマイクロサービスアーキテクチャ 第2版30分でわかるマイクロサービスアーキテクチャ 第2版
30分でわかるマイクロサービスアーキテクチャ 第2版
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 

Ähnlich wie ドメイン駆動設計とマイクロサービス

Ähnlich wie ドメイン駆動設計とマイクロサービス (20)

私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
私たち企業がアクセシビリティに取り組む理由(2018年) #accfes
 
YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略
 
Yahoo!ニュースにおける開発手法の取り組み
Yahoo!ニュースにおける開発手法の取り組みYahoo!ニュースにおける開発手法の取り組み
Yahoo!ニュースにおける開発手法の取り組み
 
現場のインフラエンジニアから見たヤフー #ヤフー名古屋
現場のインフラエンジニアから見たヤフー #ヤフー名古屋現場のインフラエンジニアから見たヤフー #ヤフー名古屋
現場のインフラエンジニアから見たヤフー #ヤフー名古屋
 
Go + Pulsar WebSocket APIの利用事例 #pulsarjp
Go + Pulsar WebSocket APIの利用事例 #pulsarjpGo + Pulsar WebSocket APIの利用事例 #pulsarjp
Go + Pulsar WebSocket APIの利用事例 #pulsarjp
 
Unification of the middle scale services by Nuxt.js
Unification of the middle scale services by Nuxt.jsUnification of the middle scale services by Nuxt.js
Unification of the middle scale services by Nuxt.js
 
Googleアシスタントアプリ実際のところ
Googleアシスタントアプリ実際のところ Googleアシスタントアプリ実際のところ
Googleアシスタントアプリ実際のところ
 
サイエンス視点からのデータアーキテクト
サイエンス視点からのデータアーキテクトサイエンス視点からのデータアーキテクト
サイエンス視点からのデータアーキテクト
 
関連記事レコメンドエンジン@Yahoo! JAPAN
関連記事レコメンドエンジン@Yahoo! JAPAN関連記事レコメンドエンジン@Yahoo! JAPAN
関連記事レコメンドエンジン@Yahoo! JAPAN
 
ヤフーの広告レポートシステムをSpring Cloud Stream化するまで #jjug_ccc #ccc_a4
ヤフーの広告レポートシステムをSpring Cloud Stream化するまで #jjug_ccc #ccc_a4ヤフーの広告レポートシステムをSpring Cloud Stream化するまで #jjug_ccc #ccc_a4
ヤフーの広告レポートシステムをSpring Cloud Stream化するまで #jjug_ccc #ccc_a4
 
ヤフーでHardeningを実施する意味 (#sec_kansai #sosaisec)
ヤフーでHardeningを実施する意味 (#sec_kansai #sosaisec)ヤフーでHardeningを実施する意味 (#sec_kansai #sosaisec)
ヤフーでHardeningを実施する意味 (#sec_kansai #sosaisec)
 
SPAを選択した理由とその結果 ~Reactを添えて~
SPAを選択した理由とその結果 ~Reactを添えて~SPAを選択した理由とその結果 ~Reactを添えて~
SPAを選択した理由とその結果 ~Reactを添えて~
 
Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~
Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~
Toolsの杜- 弥生株式会社の自動仕訳エンジンを支えるフロントエンド ~ 「ダサいは、バグだ!」を標榜してUXを徹底的に追求する ~
 
if-up 2019 | A2. クラウドにつながり始めたハードウェア
if-up 2019 | A2. クラウドにつながり始めたハードウェアif-up 2019 | A2. クラウドにつながり始めたハードウェア
if-up 2019 | A2. クラウドにつながり始めたハードウェア
 
HoloLab_20191016_ceatec
HoloLab_20191016_ceatecHoloLab_20191016_ceatec
HoloLab_20191016_ceatec
 
Yahoo! JAPANのデータ基盤とHadoop #dbts2016
Yahoo! JAPANのデータ基盤とHadoop #dbts2016Yahoo! JAPANのデータ基盤とHadoop #dbts2016
Yahoo! JAPANのデータ基盤とHadoop #dbts2016
 
Yahoo!ショッピングの サービス開発
Yahoo!ショッピングの サービス開発Yahoo!ショッピングの サービス開発
Yahoo!ショッピングの サービス開発
 
全社デザインシステムとサービスの付き合い方
 全社デザインシステムとサービスの付き合い方 全社デザインシステムとサービスの付き合い方
全社デザインシステムとサービスの付き合い方
 
IBM Cloud 2018年 振り返り
IBM Cloud 2018年 振り返りIBM Cloud 2018年 振り返り
IBM Cloud 2018年 振り返り
 
Yahoo!カレンダーにおける技術移行について - Legacy Meetup Kyoto -
Yahoo!カレンダーにおける技術移行について - Legacy Meetup Kyoto -Yahoo!カレンダーにおける技術移行について - Legacy Meetup Kyoto -
Yahoo!カレンダーにおける技術移行について - Legacy Meetup Kyoto -
 

ドメイン駆動設計とマイクロサービス

  • 1. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 2019年5月11日 ヤフー株式会社 三石 広樹 ドメイン駆動設計と マイクロサービス
  • 2. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 自己紹介 2 三石 広樹 • 2015/04 NTTグループ会社 入社 • 音響処理ライブラリ開発 • VRアプリ開発 • IoT基盤開発 • 2018/04 Yahoo! JAPAN 入社 • PF開発 ← 現在
  • 3. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ドメイン駆動設計とマイクロサービス 3 本日の内容 1. ハマらないマイクロサービス 2. ドメイン駆動設計で切り込む 3. システムを変えていく
  • 4. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ハマらない マイクロサービス
  • 5. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. システム説明 5 ○×△ ポイントプレゼント! ポイント プレゼント! コンテンツ表示
  • 6. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 入稿システム 6 ページ シナリオ 条件 コンテンツグループ コンテンツ ページ指定、パラメータ コンテンツ 入稿担当入稿ツール 入稿システム ポイント プレゼント︕
  • 7. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 開発のモチベーション 7 エンジニア育成 マイクロサービス モダンなシステムを目指して開発 The Twelve Factors
  • 8. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. データモデル 8 シナリオ情報ページ情報 コンテンツ情報 ページ シナリオ コンテンツ グループ コンテンツ 条件
  • 9. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. サービス構成 9・・・マイクロサービス? ページ コンテンツ コンテンツ グループ コンテンツ グループ コンテンツ グループ シナリオ 条件 ページ テーブル コンテンツ テーブル コンテンツグループ テーブル シナリオ テーブル 条件 テーブル バリデート
  • 10. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. サービス構成 10 ページ コンテンツ コンテンツ グループ コンテンツ グループ コンテンツ グループ シナリオ 条件 ページ テーブル コンテンツ テーブル コンテンツグループ テーブル シナリオ テーブル 条件 テーブル バリデート ページ パッケージ シナリオ パッケージ コンテンツ パッケージ バリデート パッケージ まるでモノリシックなシステム のパッケージのような・・・
  • 11. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. システムが抱えた課題 11 変化に弱い • 改修範囲が広い • 改修箇所の特定が困難 • デプロイが複雑 開発チーム コンテンツのバリデーション ルール変更して! レガシー化 企画 ページ コンテンツ コンテンツ グループ コンテンツ グループ コンテンツ グループシナリオ 条件 ページ テーブル コンテンツ テーブル コンテンツグループ テーブル シナリオ テーブル 条件 テーブル バリデート? ? ? ? ?
  • 12. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. なにかの「考え」が足りていない 12 ビジネスとサービスの不一致 ビジネスとサービスの不一致 ビジネスとサービスの不一致 ビジネスとサービスの不一致
  • 13. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ドメイン駆動設計で 切り込む
  • 14. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ドメイン駆動設計で切り込む モチベーション
  • 15. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モチベーション 15 • 改修範囲が広い • 改修箇所の特定が困難 • デプロイが複雑 マイクロサービスの切り方がよくない
  • 16. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モチベーション 16 マイクロサービス化の指標がほしい ドメイン駆動設計の 発想・手法に着目
  • 17. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ひとつのマイクロサービスで ひとつのドメインの問題を解決 モチベーション 17 ソフトウェアは ビジネス課題(ドメイン)を解決する ために在る
  • 18. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. これまでの設計 18 商品管理 API 注文管理 API 1. データ設計をして 2. Web APIに切り分ける 機能単位 で分割 請求金額 配送先 … 在庫数 … … 注文 商品
  • 19. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 配送 これからの設計 19 商品API 経理API配送API 1. モデリングをして 2. Web APIに切り分ける コンテキストの境界を探る 集約を見つける ドメイン で分割 配送先 … … … … … 請求金額 … … 注文(配送) 商品 注文(経理) 経理
  • 20. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. これからの設計 20 モデル(ビジネス視点)をベースに システムを考える データ(技術視点)をベースに システムを考える
  • 21. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ドメイン駆動設計で切り込む 現場で実践
  • 22. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 新しい案件 22 コンテンツを一括作成できるツールがほしい。 • 共通項目とコンテンツ毎の項目がある。 • 入稿システムとのデータ連携が要る。 • 入力項目をテンプレから選べるようにする。企画
  • 23. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 新しい案件 23 共通項目 個別項目1 ショッピングページページ 1000pプレゼント文言 500pプレゼント文言 http://hoge.com遷移先 テンプレAテンプレ http://fuga.com遷移先 個別項目2 コンテンツ1kp • ページ:ショッピングページ • 文言 :1000pプレゼント • 遷移先:http://hoge.com コンテンツ500p • ページ:ショッピングページ • 文言 :500pプレゼント • 遷移先:http://fuga.com 作成
  • 24. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 入稿システム 新しい案件 24 ? ?? データ連携 新規システム
  • 25. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ドメイン駆動設計をはじめよう 25 ドメインをモデリングしよう!! ドメイン駆動設計 試したい !? 自分 チームメンバ
  • 26. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モデリング 26 ユーザはなににどんな関心が あるのか? 関心事をモデリング(設計)しよう
  • 27. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モデリング 27 共通項目 コンテンツ 入力値 個別項目 テンプレート 入力項目 1. モデルを洗い出す 共通項目 入力値 コンテンツテンプレート 入力項目 2. 関係を整理する
  • 28. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モデリング 28 共通項目 コンテンツ 入力値 テンプレート 入力項目 3. なにか違和感 コンテンツ セット 共通項目 コンテンツ 入力値 テンプレート 入力項目 4. 新しい関心事が見えた コンテンツセット と共有項目がある
  • 29. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モデリング 29 表面化していないモデルを定義した • まだ曖昧なモデルを見つけた • これから必要になると予想した ビジネスも常に成長途中 エンジニアがモデル明確化をフォロー
  • 30. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モデリング 30 コンテンツ 入力値 テンプレート 入力項目 集約とコンテキスト コンテンツ セット 共通項目 コンテンツセット コンテキスト テンプレート コンテキスト コンテンツ セット テンプレート コンテンツセットを集約として 登録・更新・閲覧・削除ができる テンプレートを集約として 登録・更新・閲覧・削除ができる APIに分割
  • 31. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. モデリング 31 集約をユースケースから考えた • ユーザの操作対象がなにかを追求した • 操作する単位をビジネスサイドと議論 ビジネス視点で考えて ドメインを操作したい単位を見極める
  • 32. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 入稿システム 新規システム 32 コンテンツ セット テンプレートマッピング 入稿コンテキスト コンテンツコンテキスト
  • 33. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 33 クリーンアーキテクチャ REST API パッケージ構成 出典:The Clean Code Blog by Robert C. Martin (Uncle Bob) http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html Interface • Controller Application • Use Case Domain • Model • Repository • Service Infrastructure • Repository/Persistence DIP 依存性逆転
  • 34. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. ドメイン駆動設計で切り込む 実践を終えて
  • 35. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 得られたメリット 35 • 改修範囲が広い • 改修箇所の特定が困難 • デプロイが複雑 ビジネスとサービスの単位一致により局 所化 クリーンアーキテクチャで明確化 変更のあったサービスだけのリリース
  • 36. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 得られたメリット 36 考慮漏れ リファクタ 機能追加 仕様変更 ドメイン駆動設計が守る コンテンツ セット テンプレートマッピング
  • 37. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 気付いた難しさ 37 チーム 技術 • ドメイン駆動設計の理解を得難い • 複数チームだと難しい • 初期実装コストが高い • ドメインを守ることが大変
  • 38. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. これから守りたいポイント 38 モデリングとサービス分割 実装は後でリファクタリングできるけど サービスの分離は容易でない 最初のシステム設計が肝心
  • 39. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. システムを変えていく
  • 40. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 既存システム再構築計画 40 ドメイン駆動 設計後の姿? ① ② ③ 段階を踏んで理想の姿へ ページ コンテンツ コンテンツ グループ コンテンツ グループ コンテンツ グループシナリオ 条件 ページ テーブル コンテンツ テーブル コンテンツグループ テーブル シナリオ テーブル 条件 テーブル バリデート
  • 41. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 変化 未来のために 41 この壁を壊すのはエンジニア コンテンツ セット テンプレートマッピング
  • 42. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 変化 未来のために 42 この壁を築くのもエンジニア コンテンツ セット テンプレートマッピング
  • 43. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 未来のために 43 次のレガシーを残さない
  • 44. Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved. 44 EOF

Hinweis der Redaktion

  1. 自己紹介 名前 経歴 NTTグループに新卒入社してSIerとして仕事をしていました。 昨年4月にヤフーに転職をして、現在はPF開発をしています。 本日の話は、このPF開発の中でドメイン駆動設計を実践した話です。
  2. この内容でお話します。 ハマらないマイクロサービス マイクロサービスアーキテクチャを取り入れたモダンなシステムを開発しようとたけれど、うまく開発できずレガシー化してしまった話です。 ドメイン駆動設計で切り込む マイクロサービス化を成功させるためドメイン駆動設計を取り入れ、現場で実践した話です。 今日の話のメインとなります。 システムを変えていく 最後に簡単に、ドメイン駆動設計の実践を通じて感じたこと、考えたことの話で終わります。
  3. 私たちが開発しているシステムの説明ですが、ヤフーが提供するサービスにコンテンツを返却するシステムとなっています。 例えば、ヤフーショッピングであれば画面の上部に「○×ポイントプレゼント!」のようなコンテンツが出ていることがあります。 この「○×ポイントプレゼント!」というコンテンツを、サービスからのリクエストに応じて返却するPFを開発しています。 ヤフーの多くのサービスで使われているので、もしかしたら私たちが返却しているコンテンツをご覧になられた方もいるかもしれません。
  4. 具体的には、コンテンツがほしいサービスは、どのページのコンテンツがほしいのかとパラメータをPFへ送ります。 そうすると、PFはページとパラメータに従ったコンテンツを返す。 コンテンツの正体はHTMLなので、コンテンツを受け取ったサービスがコンテンツをそのまま表示します。 PFはパラメータを受け取ったとき、その情報をもとに条件分岐をしてコンテンツを選択します。 条件分岐というのは、例えばログインしているユーザであるかどうかのYes/No分岐です。 この条件やコンテンツは、事前に入稿担当者が入稿ツールを使ってシステム上に登録して管理しています。 今日はこの入稿システムにフォーカスしたマイクロサービス化の課題とドメイン駆動設計の話となります。
  5. システムの細かい話の前に、どういったモチベーションで私たちがシステム開発に取り組んだかを説明させてください。 まず大きな軸として若手エンジニアの育成がありました。 これは、PaaSやCaaSといったクラウド・コンピューティング技術を利用したアプリケーションの開発ができるエンジニアの育成を指します。 そのため、育成を支える要素としてマイクロサービスやTwelve Factorsの導入を試みました。 でも残念なことに、モダンなシステムをうまく開発できなかった・・・というのがこれからのお話となります。
  6. ここからシステムの説明ですが、私たちは普段データを軸に開発に着手しています。 だいたいが要件からER図を書き起こして関連を整理しています。 入稿システムでは、ページというデータを親玉としてシナリオデータとコンテンツグループデータを紐づけています。 シナリオは、「このユーザはログインしています」といった条件の集まりと、これら条件分岐の先にどのコンテンツグループへ到達するかの情報を持っています。 コンテンツグループは複数のコンテンツを持っていて、A/Bテストだったりランダムなコンテンツを返却するといった仕組みを実現します。 このようなデータモデルなので、ユーザは、あるページに対してシナリオやコンテンツを作成する、ということを行います。 そして、サービスはページとパラメータを指定することで、条件分岐の末にコンテンツを取得することができます。
  7. こうしたデータモデルのとき、マイクロサービスにしたらこのような分け方になりました。 大きくは2種類のREST APIに分かれていて、ページ・シナリオ・コンテンツといったデータのCRUDを行うAPIと、各データのバリデーションを行うAPIに分かれました。 技術スタックとしては、APIはGoで書かれていてAPIもフロントも全てPaaS上で動作しています。 機能という点で分割はできているし、CI/CDの仕組みも導入して個別の機能でリリースすることもできていますが、この分け方がマイクロサービスなのだろうか?という疑問がありました。
  8. 例えるなら、モノリシックなシステムのパッケージをそのままバツンとサービスに切り出しました!というような感じに見えます。 この見え方はおそらく正しくて、結果としてマイクロサービスにしたメリットをあまり得られずいろいろな課題も出てきました。
  9. 例えば、新しくコンテンツのバリデーションルールを変更したいという改修の要望が出てきたとき、マイクロサービスなのに改修範囲が広くなっています。 というのも、「バリデーション」という仕組みに対して、あるマイクロサービスがコンテンツのバリデートルールを全て実装しているのではなく、複数のAPIでバリデートしているためです。 型チェックや閾値チェックといった簡単なバリデーションはAPIで行っていますが、複雑なバリデーションはフロントで行っています。 複雑なバリデーションですが、例えば、シナリオに設定されているコンテンツグループやコンテンツは削除できないという仕様があるとき、フロントのツール側でシナリオAPIのエントリポイントを叩いてコンテンツの設定状況を確認します。 そして、設定されていれば削除ボタンを表示しない、という仕組みにしています。 こうした実装がいたるところにあるため改修範囲が広く、「バリデーションルールを変更してほしい」という比較的単純な要求であっても改修箇所がどこなのかをすぎに判断できません。 また、複数のAPIの修正が必要なことも多いためデプロイに依存関係ができて、デプロイが複雑になりました。 まとめると、改修や機能追加といった変化に弱いシステムとなってしまい、いってしまえばレガシー化してしまいました。 これらの問題は、モノリシックなシステムのときによくあった、どのパッケージを変更すればいいのかわからん!サービス層とDAO層の両方にビジネスロジックが入り込んでる!とか、小さな改修なのにシステム全体のデプロイが必要で大変だ!のような問題がマイクロサービスでも同様に発生しました。
  10. モダンなシステムを作ろうから始めたけど、結果的にレガシーなシステムと似た課題にぶつかりました。 マイクロサービスにしたし、技術スタックもモダンなものを選定したけれど課題感はレガシーシステムとあまり変わりません。 そして、現在は機能追加を行うたびにひとつのマイクロサービスがどんどん巨大化しています。 なぜこうなってしまったのかを考えたとき、手法はモダンでも「考え方」が変わっていないことが原因のひとつとしてあるかもしれません。 マイクロサービスやTwelve Factors、PaaSなど方法は新しいことを実践したけれど、私たちの考えのベースは「技術」が優先で「ビジネス」の考慮が足りていなかったのかもしれません。 または考慮していても最重要視していませんでした。 結果として、モダン化したはずなのに辛い状況に陥りました。
  11. さきほどお話した課題ですが、顕在化してしまった原因のひとつにマイクロサービスの切り方がよろしくないことがあるかと思います。 大きすぎず小さすぎず、適切にマイクロサービスにできていれば、ビジネスに対するシステム改修の範囲が要求と一致するはずです。 しかし、私たちのシステムは要求と改修範囲が一致しておらずレガシー化しました。
  12. 私たちのチームでは、マイクロサービスにするときにどのように分割するかはエンジニアそれぞれで違います。 インフラ側を重視する人もいれば、より抽象的に考える人もいます。 それぞれがディスカッションしてマイクロサービス化の単位は話し合いましたが、いずれも共通するのは技術視点でした。 そのため、マイクロサービスにするときの新しい視点、そしてチームで共有できる指標が得られればと考えドメイン駆動設計に目を着けました。
  13. ドメイン駆動設計の文脈で出てくることとして、ソフトウェアはドメイン(つまりビジネス)の課題を解決する、とあります。 これは正しいと思いました。 絶対では無いかもしれませんが、エンジニアはビジネス課題をエンジニアリングで解決するために開発するのであって、技術を優先して開発するものではないかと思います。 ドメイン駆動設計の考え方でもって、ビジネス課題の領域とひとつのマイクロサービスが解決する領域を一致させることができれば私たちが抱えた課題も解消できるのではないかと考えました。
  14. これまでの設計の多くはデータをベースにしていました。 ここで指すデータとは、ER図やクラス図をベースにした技術的な視点で考えたデータとそれらの関連のことです。 そして、データが持つ振る舞い(機能)に着目してマイクロサービスになるよう分割をしていました。 この例だと、商品と注文というデータがあったとして、商品は在庫数などをパラメータに持ち、注文は請求金額や配送先をパラメータに持っていたとします。 このとき、きっと私たちは商品を管理するAPIと注文を管理するAPIに分割します。 なぜなら、商品というデータに対する機能と注文というデータに対する機能を別々のAPIに分離すれば改修も閉じられ、マイクロサービス化できたと考えるからです。 しかし、この文脈ではビジネスが出ていません。 そのためシステムを見ても、なんとなくECシステムかな?とは思うものの、誰が何に使うのか、もっといえばどのような目的(つまりビジネス)に使うのかがわかりません。 もしかしたら商品を配送する人が使うかもしれませんし、経理の人が商品の出納や売上を管理するために使うのかもしれません。 その両方で使えるシステムなのかもしれません。 仮に配送業者と経理の人が使うシステムならば、商品にも注文にもそれぞれで必要なパラメータや振る舞いが追加されていき、結果として巨大なAPIがふたつ出来上がってしまいます。
  15. これまでの設計では、最初は小さくマイクロサービスとして分割できたとしても時が経てば巨大化しレガシーになってしまいます。 そのため、これからはドメイン駆動設計に出てくる「コンテキストの境界を探って」「集約を見つけ出し」マイクロサービス化することが必要だと考えます。 注文と商品というデータがあったとしても、ビジネス視点で考えたとき、同じ注文というデータであったとしても、経理から見た注文と配送から見た注文はパラメータが異なります。 経理には注文に請求金額がなければならないでしょうし、配送には配送先のパラメータが必要です。 そして、経理に配送先のパラメータは不要です。 こういった、注文というモデルが実はふたつある!という事実はデータだけを見ていても見つけ難いかと思います。 しかし、ビジネス視点でどこにコンテキストの境界があるのかを探ると見つけられるのではないかと思います。 この例だと、最終的に商品というモデルは経理と配送で共有しなければならないけど、注文に関しては別々のモデルであるためAPIが分割されました。 ドメイン駆動設計の考えで設計を行うと、システム構成そのものがこれまでとは大きく変わるのではないかと思います。
  16. テンプレBの例は画像URL入力で行う
  17. メモ:スライドを移す前に「ドメイン駆動設計でシステム全体は変化に強くなった。次はそれぞれのマイクロサービス自体が実装変更という変化に強くするためにどうしたかを簡単に説明」というのを話す。
  18. クリーンアーキテクチャ ・ビジネス仕様やルールといったドメインが持つ守るべきレイヤを外部の変更から守る