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
ビジネスの構造を扱うアーキテクチャとユーザとの接点を扱うアーキテクチャ #builder...
Search
Akira Suenami
August 30, 2019
Technology
46
11k
ビジネスの構造を扱うアーキテクチャとユーザとの接点を扱うアーキテクチャ #builderscon
Builderscon Tokyo 2019 の発表資料です。
Akira Suenami
August 30, 2019
Tweet
Share
More Decks by Akira Suenami
See All by Akira Suenami
オブジェクト指向考古学 〜人類は再びDCIの夢を見るか〜
a_suenami
5
1.9k
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか #sekkeinight
a_suenami
14
5.8k
値と属性の話
a_suenami
0
180
ドメインモデラーにとって受託開発であることは制約なのか?
a_suenami
1
1.3k
異なるモデリングパラダイムから見るモデリングの勘所 #ooc_2020
a_suenami
2
2.9k
マルチパラダイムモデリング 〜異なるモデリングパラダイムから見るモデリングの勘所〜 #PHPerKaigi
a_suenami
0
3.7k
“ユーザーファースト”の功罪 〜分析と実験によるアーキテクチャ設計〜 #bpstudy
a_suenami
4
1.3k
ドメインモデルのつくり方 #5000dai
a_suenami
16
4.7k
すえなみチャンスからの重要なお知らせ #すえなみチャンス暑気払い
a_suenami
0
770
Other Decks in Technology
See All in Technology
元旅行会社の情シス部員が教えるおすすめなre:Inventへの行き方 / What is the most efficient way to re:Invent
naospon
2
340
IBC 2024 動画技術関連レポート / IBC 2024 Report
cyberagentdevelopers
PRO
0
110
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
190
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
170
The Role of Developer Relations in AI Product Success.
giftojabu1
0
120
[FOSS4G 2024 Japan LT] LLMを使ってGISデータ解析を自動化したい!
nssv
1
210
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
370
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
200
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
120
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
130
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
750
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
240
Featured
See All Featured
Scaling GitHub
holman
458
140k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
The Language of Interfaces
destraynor
154
24k
GitHub's CSS Performance
jonrohan
1030
460k
We Have a Design System, Now What?
morganepeng
50
7.2k
Music & Morning Musume
bryan
46
6.2k
Unsuck your backbone
ammeep
668
57k
Thoughts on Productivity
jonyablonski
67
4.3k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
How to Ace a Technical Interview
jacobian
276
23k
Transcript
ビジネスの構造を扱うアーキテクチャと ユーザとの接点を扱うアーキテクチャ 2019/08/30 Builderscon Tokyo 2019 末並 晃 @a_suenami
自己紹介 • 末並 晃 @a_suenami • 生息している界隈: DDDとか、TDDとか、RDBとか • お仕事で使ってる技術スタック:
Rails, React, 最近 Java とかも 少々 • 好きな RDBMS: PostgreSQL • 好きな制約: チェック制約 • 好きな焼肉の部位: ハラミ • 好きな(ry
インターネット上での立場
インターネット上での立場 ひたすら焼肉をタカられるという エンターテイメントをインターネットに提供し ています。 (焼肉を奢るとは言ってない)
インターネット上での立場 とはいえ、すえなみチャンスは わりと真面目に募集しています。 いろいろ教えてください。
今日の話 SoR と SoE
SoRとSoE • SoR: System of Record ◦ その名の通り、「記録」のためのシステム。 ◦ 入力の事前チェックの堅牢性、データ整合性の担保などが求
められる。 • SoE: System of Engagement ◦ 利用者との関係を構築するためのシステム。 ◦ 今どきの言葉を使うとよい UX を提供するためのシステム、と 言い換えてもよい。
SoRとSoEの対比 SoR SoE 基本的な設計観点 データ整合性 柔軟性、性能 データストア トランザクショナルな DB 多くの場合、RDB
スケーラビリティがある高速なデータ ストア ドキュメント指向DB、KVS、全文検索 インデックスなど リリースサイクル SoEと比べると相対的に長い(諸説あ るかも) 高速なリリースサイクルが求められる 品質評価 トラディショナルなソフトウェアテスティ ング手法を適用しやすい トラディショナルな手法に加え、ユー ザーテスト、ユーザーインタビュー、 A/Bテストなど カナリアリリースも実トラフィックを利 用したテストと捉えることができる データ整合性 トランザクション整合性が必須 結果整合性でよい要件も多い 要するに? 堅牢なMutation 柔軟なQuery 設計を駆動する(しやすい)もの ドメインモデル、概念データモデル UI(ビジュアルデザイン、ユーザインタ ラクション)、キャッシュ
本発表のモチベーション • システム特性を SoR/SoE という分類をするのは直感的によいと 思ったが、何故そう思ったかを各設計原則や設計パターンをベー スに言語化したくなった。 • 単なるバズワードとしてではなく、どのような設計観点があり、ど のような要求に対応し、どのような品質特性を満たすべきかを捉
え直したい。 • 現在、扱っているアーキテクチャ設計についてご紹介をしたい。
注意 • SoR/SoE は物理的に分けられている必要は必ずしもなく、言語やフ レームワークが持っているモジュール化や抽象化の仕組みで十分に分 割できる。 • 物理的に分割するべきかどうかは microservices 界隈でさんざん議論
されてるように、リリースサイクルや組織構造の問題であり、それが構 造を与えるものか、接点を与えるものかとは別問題である。
今日しゃべること • モデルとは何か • 各設計原則とSoR/SoE • SoR/SoEの実践
モデルとは何か
https://speakerdeck.com/a_suenami/moderutohahe-deatute-he-denaifalseka-number-kichijojipm
モデルとは? https://ja.wikipedia.org/wiki/統一モデリング言語
モデルとは?
モデルとは? https://eng-etymo.com/archives/829#toc4
解決したい問題領域から 必要だと思われる情報を抽出して (逆に不要だと思われる情報を捨て) 記号化、可視化したもの
例: 地図 • 方角、距離、面積などのあらゆ る変数があるなか、それを正 確に表現できているのは地球 儀のみ ◦ それでも完全に正確とは言 えない
• メルカトル図法、正距方位図法 など、目的に応じてさまざまな 図法がある
例: 連立方程式
モデルの世界と現実の世界
エリック・エヴァンスのドメイン駆動設計
モデル駆動設計
モデル駆動設計とは • 分析モデルと設計モデルを分けず、単一のモデルで両方の営み を実現する手法をエリック・エヴァンスはモデル駆動設計と呼び、 ユビキタス言語と並び DDD 本の中心的な主張となっている。 • そのためにオブジェクトモデルをモデルの中心として採用するべ きだと言っているが、他のモデリングパラダイムを否定しているわ
けではない。
第一部まとめ • モデルとは解決したい問題のうち、必要な情報を抽出し、特徴づ け、記号化/可視化をしたものである。 • これ自体はソフトウェア開発に閉じたものではないし、実装の方 法論というわけでもない。 • どのようなモデルが有効であるかは当然ながら対象とする問題領 域に依存する。
既存の設計手法とSoR/SoE
[再掲] 本発表のモチベーション • システム特性を SoR/SoE という分類をするのは直感的によいと 思ったが、何故そう思ったかを各設計原則や設計パターンをベー スに言語化したくなった。 • 単なるバズワードとしてではなく、どのような設計観点があり、ど
のような要求に対応し、どのような品質特性を満たすべきかを捉 え直したい。
今回扱う事例: 2-sided platform • モール型 E-Commerce サービスを考える • システム利用者 ◦
購買者ユーザ ◦ 店舗ユーザ モール型 EC プラットフォーム 購入者 店舗
Clean Architecture
単一責務の原則(SRP) • SOLID 原則の一つで「クラスの変更理由はひとつであるべきであ る」とする設計原則。 • アンクル・ボブは Clean Architecture においてこの「変更理由」
をさらに「アクター」と言い換えた。 • つまり、あるクラスやモジュールの変更は単一のアクターの変更 要求によるものであるべきである。 • DBA や経営者もアクターの例として挙げられており、利用者だけ でなく、より広範な利害関係者を指している。
単一責務の原則(SRP) • CleanArchitecture ではクラスやモジュールの設計という観点で 取り扱われているが、アプリケーション全体をある単一のアクター のためのものであると考えることも可能ではないか、というのを思 考の出発点にする。
しかし、素朴に分割すると…
分断されたモノリス!! 購買者向け システム 購入者 店舗 店舗向け システム 共通DB
複数のアクターの要求がDBに直撃する 購入者 出荷担当者 いつ届くの? キャンセルしたい 商品を間違ったので 変更したい 出荷しないと! 在庫が残り少ないので仕 入れ指示をしたい
キャンセルされたので出 荷を止めます 「商品」「購入」などは一見ユビキタス言語かのように思われる が、多くの場合、次第に乖離し始める。 共通DB ふ、ふええ…
もう一度、全アクターを見てみる 経営者 オペレーター マーケティング 責任者 倉庫・物流 管理担当者 商品購入者 システム連携 クライアント
出荷 担当者
アクターを分類してみる 経営者 オペレーター マーケティング 責任者 倉庫・物流 管理担当者 商品購入者 システム連携 クライアント
出荷 担当者 事業者アクター 利用者アクター
利用者アクターと事業者アクター • 利用者アクターは自分がやりたいことややるべきことをできるだけ 簡単にストレスなく完遂できることを望む。 • 事業者アクターは自分たちの事業を円滑に進めること、事業上の 意思決定の支援をすること、蓄積されたデータや情報から新たな 事業を創出すること等を望む。 • ドメインモデルと呼ばれるものは事業者アクターの視点のモデル
であることが多いと感じる。 ◦ それがいいことかどうかは何とも言えない。
None
中央に事業者向けのモデルがあると考える 購買者向け システム 購入者 店舗 店舗向け システム 事業者の モデル •
DB を直接共有しないため、利用者アクターのユースケースに依 存しない不変条件を維持することができる。 • システム全体が、事業者、購買者、店舗をそれぞれの要求元とす るサブシステムに分割された。
勘のいい皆さんはもう気づきましたね?
SoR と SoE 購買者向け システム 購入者 店舗 店舗向け システム 事業者の
モデル SoE SoR
ここまで考えると 他の設計原則やパターンとの 関連性も見えてきます
プレゼンテーションとドメインの分離(PDS) • マーティン・ファウラーが提唱した、プレゼンテーションのロジック とドメインのロジックは分離するべきだとする設計原則。 https://martinfowler.com/bliki/PresentationDomainSeparation.html
プレゼンテーションはモデルなのか
再び DDD 本
境界付けられたコンテキストとコンテキストマップ • エリック・エヴァンスはあるモデルが有効な範囲を境界付けられた コンテキストと呼び、その間の関係はコンテキストマップで描くべ きだと主張した。
ドメインとプレゼンテーションの関係 • ドメインとプレゼンテーションの依存関係は、一般にプレゼンテー ションからドメインへの単方向依存である。 • DDD 本ではコンテキストマップのパターンがいくつか紹介されて いるが、ドメインとプレゼンテーションのこの関係は「顧客/供給 者」パターンに最も近い。 •
「顧客」である利用者アクターのモデルから「供給者」たる事業者 アクターのモデルに適切に振る舞いを移譲することによって、利 用者アクターのモデルはプレゼンテーション優位の状態にでき る。 • プレゼンテーション優位なアプリケーションは適切なデータモデル (ドキュメントストア、KVSなど)を選定することによって入出力駆 動での開発を進めやすくなる。
再び Clean Architecture
ペリフェリックアンチパターン • 中央にあるドメインを経由せずに、インフラストラクチャのコードを 直接呼び出してしまうアンチパターン。 • パリ郊外にあるブルヴァール・ペリフェリック環状高速道路に由来 する。 ドメイン インフラストラクチャ
ペリフェリックアンチパターン • アンクル・ボブは Clean Architecture においてこれをアンチパ ターンとしたが、プレゼンテーション優位な技術駆動アーキテク チャを選択する場合は、むしろ立派な実装パターンであると言え る。
CQRS https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf
CQRSとの関係
CQRSとの関係 • SoR/SoE という分類と Command と Query の非対称性に着目し た分離(=CQRS)は共通している部分が多く、得られる恩恵も近 い。
• Command のモデル(≒ドメインモデル)から Query のモデルへ の変換の責務をどこが担うかという違いはあるような気がする?
Command/QueryとSoR/SoE SoR SoE Command いわゆる DDD というものが最 も活躍する領域となる。 入力値のみから可能なバリデーショ ンを行い、具体的な振る舞いをSoRに
移譲する。 現在の状態に依存するバリデーショ ンが必要な場合は、それもSoRへ移 譲する。 Query リソース指向、あるいはドメイン ロジック由来の集約を単位とす るデータ構造での参照のみで きる。 RDBのマテリアライズドビューやサマ リーテーブル、ドキュメントストア、 KVS、検索インデックスなどの具体的 実装技術への依存を受け入れること によって性能、柔軟性、開発速度など を向上させることができる。
第二部まとめ • SoRは事業者アクターを要求元とするドメインモデルをもとにした アプリケーション、SoEは利用者アクターを要求元とするプレゼン テーションモデルをもとにしたアプリケーションと捉えることができ るのではないか。 • これは、Clean Architecture において主張された
SRP の定義を 発端に、PDS、境界付けられたコンテキストとコンテキストマップ、 CQRS等、既存の設計原則や設計パターンで説明することができ る。
第二部まとめ • プレゼンテーションモデル優位の場合は設計を入出力に駆動さ せやすく、ドメインロジックを必要としないことが多い。 ◦ ペリフェリックパターンは、 Clean Architecture においてはア ンチパターンとして紹介されているが、具体的実装技術に駆
動させやすいアプリケーションにおいてはむしろ立派な実装パ ターンと言えるのではないだろうか。 ◦ 実際、Greg Young の主張する CQRS パターンはそういう設 計・実装パターンである。
SoR/SoEの実践
簡易アーキテクチャ図 ユーザ Cache Store CDN Pub/Sub Topic Master Database Subscribe
Command SoE SoR
設計観点 • バリデーション • 整合性 • 採番 • 状態管理 •
キャッシュ
バリデーション
[再掲] Command/QueryとSoR/SoE SoR SoE Command いわゆる DDD というものが最 も活躍する領域となる。 入力値のみから可能なバリデーショ
ンを行い、具体的な振る舞いをSoRに 移譲する。 現在の状態に依存するバリデーショ ンが必要な場合は、それもSoRへ移 譲する。 Query リソース指向、あるいはドメイン ロジック由来の集約を単位とす るデータ構造での参照のみで きる。 RDBのマテリアライズドビューやサマ リーテーブル、ドキュメントストア、 KVS、検索インデックスなどの具体的 実装技術への依存を受け入れること によって性能、柔軟性、開発速度など を向上させることができる。
バリデーション • バリデーションと一般に呼ばれるものにも種類がある。 ◦ 入力値のチェック(長さや範囲、正規表現マッチなど) ◦ その事業において必要な不変条件 ◦ Ruby の
ActiveRecord 実装が(ry • 構造的に自明だが、前者は後者の制約より同等かそれより厳しく なければならない。 • 現在状態に依存せず、値のみで可能な入力チェックは SoE で可 能であり、そのほうが利用者に対してよい UX を提供できる可能 性が高い。 ◦ JavaScript によるリアルタイムバリデーションなど
バリデーション
バリデーション • バリデーションに関して重複を排除したいと考えた場合、基本的 に誤った共通化の可能性を考えたほうがよい。 ◦ そういう意味では SoR と SoE が物理的に分割されているほう
がよいケースもある。 ◦ サーバーサイドと同じバリデーションを JavaScript でもやるこ とに違和感を感じる人は多くないと思う。 • SoR でドメインモデルを構築している前提であれば、不変条件は 独自型(ValueObject, etc)になり、コンパイラの恩恵も受けられ る。
整合性
以前、発表したやつ https://speakerdeck.com/a_suenami/soe-akitekutiya-number-kichijojipm
グローバルな整合性とユーザローカルな整合性 • SoR 的世界観ではシステム全体、あるいは連携システムも含め た全世界(大げさ)で不整合がないことが求められる。 • 一方、SoE 的世界観ではそれを利用する利用者一人ひとりが自 分自身の世界を持っており、それがその人にとっては世界のすべ てである。
グローバルな整合性とユーザローカルな整合性 • SoR / SoE 間の疎結合性や耐障害性を高めるために、基本的に 非同期、結果整合性でのアーキテクチャを検討するといいかもし れない。 https://speakerdeck.com/a_suenami/soe-akitekutiya-number-kichijojipm?slide=16
[再掲] Command/QueryとSoR/SoE SoR SoE Command いわゆる DDD というものが最 も活躍する領域となる。 入力値のみから可能なバリデーショ
ンを行い、具体的な振る舞いをSoRに 移譲する。 現在の状態に依存するバリデーショ ンが必要な場合は、それもSoRへ移 譲する。 Query リソース指向、あるいはドメイン ロジック由来の集約を単位とす るデータ構造での参照のみで きる。 RDBのマテリアライズドビューやサマ リーテーブル、ドキュメントストア、 KVS、検索インデックスなどの具体的 実装技術への依存を受け入れること によって性能、柔軟性、開発速度など を向上させることができる。
整合性 • リクエスト可能かどうかに応える(可能な場合は一定期間ロックを とる)エンドポイントを SoR から提供し、そこは同期的に結果を返 すようにする。 • 決済処理における与信(オーソリ)と確定(キャプチャ)の関係。
採番
採番 • コマンドを結果整合性に寄せた場合、SoE はその完了を知ること ができなくなる。現実的には、ポーリングか Pub/Sub、あるいは 何らかの画面レンダリングをフックに実データを問い合わせる形 になるが、そのときのキーはリクエスト完了時には確定している 必要がある。 •
実装パターンはいくつかある。 ◦ 採番のみを行うエンドポイントを SoR が提供する。 ◦ コマンドリクエスト完了時に同期的にキーを返す。 ◦ UUID など、SoE 側で採番可能な採番体系を選択する。
採番 ポーリングモデル
採番 Pub/Subモデル
状態遷移・状態管理
状態遷移・状態管理 • SoE のベースにあるのは特定の利用者アクターにとってのモデル なので、SoR が持つ事業全体の状態遷移のモデルとは基本的に 異なる。 • SoR の状態遷移の一部だけが利用者にとっての関心領域であ
り、SoE にその複雑さを持ち込まないようにする。
状態遷移・状態管理 購入者 下書き レビュー待 ち 公開済み レビュー中 商品特集記事状態遷移 購入者の関心領域
状態遷移・状態管理 • 実装としては、RDB のビュー、別のテーブルやデータストアに保 持するといったいくつかのパターンがある。 • 物理的に分離する場合は、採番後の実データ問い合わせと同 様、ポーリングや Pub/Sub 等で状態を最新に保つ工夫をする必
要がある。
キャッシュ
キャッシュ • キャッシュは基本的に SoE の関心時だと心得る。 • SoR 側の構造に引きずられないように、あくまで利用者の UX を
ベースに考える。 ◦ ネイティブアプリや SPA (Single Page Application) のように サーバーサイド API とクライアントが分離されている場合はク ライアントがキャッシュしたい単位でエンドポイントや JSON 構 造を設計する。 ◦ 難しい場合は BFF (Backend For Frontend) の導入も検討す る。
[再掲] 簡易アーキテクチャ図 ユーザ Cache Store CDN Pub/Sub Topic Master Database
Subscribe Command SoE SoR
キャッシュ キャッシュ指向のJSONオブジェクト設計
キャッシュ • キャッシュとそのリフレッシュに対する戦略はいろいろ考えられ る。 ◦ キャッシュしない(毎回、SoR へ問い合わせる) ◦ Pub/Sub によるリフレッシュ
◦ Expire を待つ(一時的な不整合を許容する) ◦ etc...
まとめ • アプリケーションの要求元を事業者と利用者に分け、そのそれぞ れについてモデルを構築し、実装を考えると、それは一般に SoR / SoE の特性と呼ばれているものと一致する。 • バリデーション、整合性、採番、状態管理、キャッシュなどの具体
的実装について、SoR / SoE のシステム間連携をどのように行う かの事例を紹介した。
まとめ
まだまだ試行錯誤している最中なので ぜひいろいろ議論したいです。 よろしくお願いします。