Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RDRAとDDDでGoのモジュラーモノリスアプリを設計してみた話
Search
Imamoto Hikaru
September 15, 2022
Programming
3.9k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RDRAとDDDでGoのモジュラーモノリスアプリを設計してみた話
Imamoto Hikaru
September 15, 2022
More Decks by Imamoto Hikaru
See All by Imamoto Hikaru
日々のSlackアラート確認運用をCustom Chat Modesで楽にした話 / 日々のSlackアラート確認運用をCustom Chat Modesで楽にした話
imamotohikaru
0
1.1k
実践!RDRAを活用した既存システムの仕様変更 / Specification Changes in Existing Systems Utilizing RDRA
imamotohikaru
1
8.1k
RDRA/DDD/Goでモジュラーモノリスのアプリを開発してみた話 / developing a modular monolith application with RDRA DDD Go
imamotohikaru
3
2.7k
SRE課が開発中システムのCI/CDで取り組んでいるGitOpsの話 / GitOps with ArgoCD
imamotohikaru
1
2k
Other Decks in Programming
See All in Programming
Agentic UI
manfredsteyer
PRO
0
150
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
530
JavaDoc 再入門
nagise
0
330
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
230
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
5.5k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Webフレームワークの ベンチマークについて
yusukebe
0
160
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
220
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
120
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
210
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
480
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Navigating Team Friction
lara
192
16k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
A Tale of Four Properties
chriscoyier
163
24k
Embracing the Ebb and Flow
colly
88
5.1k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Transcript
#modelinglt ©2022 RAKUS Co., Ltd. RDRAとDDDで Goのモジュラーモノリス アプリを設計してみた話 株式会社ラクス 今本光
#modelinglt 今本光(いまもとひかる) SI企業でのエンジニア経験を経て 2021/10にラクスに入社。 SRE課 BusinessPlatform チーム所属。 社内の複数サービスを横断したビ ジネス基盤となるアプリケーション の開発に携わっています。 趣味:野球観戦、サウナ、日向坂46
休日はコワーキングスペースでGo のコードを書いたり資格の勉強を することが多いです。 Twitter: @imamotohikaru GitHub: @kudagonbe
#modelinglt 設計したアプリケーションの概要
#modelinglt 設計したアプリケーションの概要 • 2021年10月の入社直後からアサイン • 業務運用課の要望を元に現在開発中の新規システム • 運用コスト削減や運用作業品質向上を目的としたWebアプリ ◦ 現在は人の手で判断・作業している運用業務を削減
• 現在の運用は複雑化されたデータ構造のシステムに依存してい て、今回のシステム化でも脱却しないため外部システムとの連携 が必要
#modelinglt フェーズごとの戦略 フェーズ 戦略 効果 要件定義 RDRA (リレーションシップ駆動要求分析 ) ・要求元の要求と整合性を取る形で、
業務やビジネスユースケースを洗い出し ・業務フロー図+UC複合図で 必要な画面やシステムの機能洗い出し ・要求元との要件合意の迅速化 設計 DDD (ドメイン駆動設計) ・RDRAをインプットとした コンテキスト分割やドメイン名 ・コンテキストマップで責務を集約 実装 Goでモジュラーモノリス (WorkspaceModeを使用) ・コンテキストマップ上のコンテキスト名や コンテキスト間の依存関係を元に そのままモジュール化できる ・モノレポでデプロイを 1つのアプリとなるが、 モジュール分割しているので並行開発も容易
#modelinglt 全体のアウトプットイメージ
#modelinglt 要件定義フェーズ
#modelinglt 要件定義フェーズ:RDRAを実践 • RDRA(リレーションシップ駆動要求分析)とは ◦ 神崎善司さん(@zenzengood)が提唱している要件分析手法 ▪ 本資料での説明も RDRA2.0ハンドブック を参考にしています。
◦ 要件定義には4つの視点があり、RDRAではそれぞれの視点を「レイヤー」 として定義 ▪ システム価値>システム外部環境>システム境界>システム ◦ 上位レイヤーは下位レイヤーの”Why”となり、下位レイヤーは上位レイヤー の”What”となる ◦ 上位レイヤーから要求分析することで、網羅的な要件定義が可能
#modelinglt レイヤーごとの視点 • システム価値レイヤー ◦ システムが「誰にとっての価値を実現するのか」を明らかにする ▪ 関連するアクターや外部システム、システム化目的等を定義 • システム外部環境レイヤー
◦ システムが「どのように使われるのか」を明らかにする ▪ 業務やビジネスユースケースを洗い出し、業務フローや利用ケースを定義する • システム境界レイヤー ◦ システムと「どう関わるか」を明らかにする ▪ 誰がどのようにシステムを利用するかや、システムの処理の単位(ユースケース)を定義する • システムレイヤー ◦ システム化する「情報」とその情報が取り得る「状態」でシステムを明示する
#modelinglt RDRAの表現手法と記述例 • アイコン ◦ レイヤーごとに定義されるモデルを 表す • ダイアグラム ◦
レイヤーごと明らかにすべき事柄を 示すための図 • 右図はシステムコンテキスト図 ◦ 「システムコンテキスト図」はシステム 価値レイヤーで定義されるダイアグラ ム ◦ システムに関わるアクター、外部シス テムをアイコンとして定義する ◦ システム化の目的を認識合わせする
#modelinglt 今回作成した ダイアグラム • 「業務フロー+UC複合図」のみ複数 レイヤーを跨ぐダイアグラム • 作図はdraw.ioで行った上で、 GoogleSpreadSheetに集約 •
それぞれの詳しい説明は時間の関係 上できないため、RDRA2.0ハンド ブック 等をご参照ください。
#modelinglt RDRAを実践してみた感想 • 「要件定義」にとどまらず「基本設計」まで踏み込んだドキュメント が完成される ◦ 内容が具体的になるので要求元との要件合意がより迅速・明確にできる ◦ 入社直後の私にとっては社内システムやルールの学習にも有用だった •
「業務」や「ビジネスユースケース」の分割は難しい ◦ 最終的には決めの問題なので、試行錯誤して決定する必要がある • ビジネスとシステムのバランス感覚が必要 ◦ システムに寄りすぎると、ビジネス側の人に内容を理解してもらえない
#modelinglt 設計フェーズ
#modelinglt 設計フェーズ:DDDを実践 • DDD(ドメイン駆動設計)とは ◦ ドメイン(≒システム化対象となる業務の世界)の専門家からの入力を元に、ドメインの世界 に一致するようにドメインをモデル化する設計手法 • 戦略的DDD ◦
ドメインをモデリングするための設計戦略 ▪ 境界づけられたコンテキスト、ユビキタス言語の定義等 • 戦術的DDD ◦ 設計した内容を実装するためのモデリング ▪ エンティティや値オブジェクトを定義するドメインモデリングはここに属する
#modelinglt 戦略的DDDの実践 • コンテキストマップの作成 ◦ RDRAの「ビジネスコンテキスト」「業務フロー+UC複合図」を主なインプットとして、 分割できる業務領域を洗い出して境界付けられたコンテキストを定義 ◦ コンテキスト間の依存関係も含めたコンテキストマップを作成 ▪
コンテキスト間が相互依存or循環参照にならないように設計 ◦ コンテキストごとの責務を明確化してコンテキストマップに付記 • ユビキタス言語となる用語集の作成 ◦ RDRAの「情報モデル」を主なインプットとして、コンテキストごとに「用語説明」とい う形で主なユビキタス言語を付記
#modelinglt コンテキストマップイメージ
#modelinglt コンテキストごとの設計資料 • レイヤーごとにインプット資料を作成 ◦ コンテキストごとにレイヤードアーキテクチャ構成をとる想定のため • Domain層:ドメインモデル図 • UserInterface層、Application層:シーケンス図
• Infrastructure層:テーブル設計
#modelinglt DDDを実践してみた感想 • 前フェーズのRDRAの資料をインプットとして活用できた点が良かった ◦ RDRAで基本設計まで踏み込んでいるので、モデリングがしやすかった ◦ 開発のためのDDDから一歩前進できた • テキストベースでの用語説明や設計意図説明も残しておいた方が良い
◦ 「ドメインモデル図さえあれば実装できる!」という人はドメインモデルの作成者しかいな い • mermaid.jsを使ってmarkdownファイル内で書いたので、レビューもし てもらいやすかった ◦ GitHubがmermaidの自動レンダリングに対応している
#modelinglt 実装フェーズ
#modelinglt 実装フェーズ:Goでモジュラーモノリス • Goには「module」というコード管理 単位が存在 • go.modというファイルにmodule名 や依存するmoduleを記載 • go.modが置かれているフォルダ配下
はすべて同moduleに属する • ただしサブフォルダに別のgo.mod ファイルが置かれている場合は、別の moduleとなる • module間の依存解決の手段として Workspace modeを利用 Main Module Module A Module B Main Module Workspace 管理
#modelinglt GoのWorkspace mode • Go1.18から導入 • Moduleの解決をgo.workファイルに記述できる
#modelinglt 実装の基本方針 • 設計時に定義したコンテキストの単位でGo Moduleを作成することで、モジュ ラーモノリスを実現する ◦ Module名やModule間の依存関係はコンテキストマップを踏襲 ◦ 1つのリポジトリ(モノレポ)で複数Moduleを管理
◦ Workspace modeで同一リポジトリ内のModuleにも依存可能 • Moduleごとにレイヤードアーキテクチャ構成にする • コンテキストごとにDBも分割 ◦ PostgreSQLで同一DBクラスタで複数DBを作成 • 外部からのHTTPSリクエストはメインのModuleで受けて、各コンテキストの UI層にリクエスト情報を渡す形でAPI呼び出しを実現
#modelinglt 未来の話:モジュラーモノリスをMSA化 • 今後、必要性を感じてMSA化する場合はModuleを別リポジトリに切 り出してIN/OUTを調整することで実現可能 ◦ 作成済みのAPIを呼び出すエンドポイントを準備 ▪ UI層まで作成済みなので、工数としては大きくない ◦
切り出したModuleのメソッドをInfrastructure層で呼び出していた箇所を、API 呼び出しに切り替える ▪ レスポンスのフォーマットは基本的に変わらず、改修箇所の特定も容易なので、工数としては大き くない ◦ DBは既に分離済みのため、大きなマイグレーション不要
#modelinglt Goでモジュラーモノリスを実践してみた感想 • DDDの境界づけられたコンテキストがソースコードにも対応づけられる ので、要件定義・設計フェーズとの一貫性が出て良かった • Go ModuleやWorkspace modeでモジュール化が容易なので、モ ジュラーモノリス構成を実現するのにGoは適した言語だと思う
• GoでDDDを実践するための実装手法についてもある程度方向が定 まったが、手探りになる場面が多かった ◦ 知見を更に貯めて別の機会に発表したい
#modelinglt ご清聴ありがとうございました。