初めに
とある事からどちらもメンテナンス性に優れるという特徴を持つ、
- マイクロサービスアーキテクチャ
- ドメイン駆動開発
の違いを調べることになったのでメモ感覚でアウトプットしてみます。
私の主観が大いに入っていますので、気になる点がありましたらご指摘ください!
マイクロサービスアーキテクチャの簡単な説明
サービスの変化に強い開発手法。
メール、DB、ログイン機能、決済機能...とサービス単位でアプリケーションを分けてしまう。
Dockerのコンテナオーケストレーションを採用するパターンが多い。
新たな機能追加や改修も影響範囲が極小で済む。
アプリケーション単位でのスケーリングも可能。障害に強い。
メリット
- 障害に強く、メンテナンスが非常にしやすい
- 機能追加や改修に寛容
- 他の機能を全く気にせず実装できる
- 機能ごとにアプリが違うからこそ、Java、PHP、Node、Ruby等開発者の好きな言語、環境を選択できる
- 開発チーム結成時に全員Java、全員PHP等技術者の縛りがなくなるので人員を集めやすい
デメリット
- 機能全体としてのテストがしにくい
- APIでアプリケーションを繋ぐので通信の遅延がネック(オーバーヘッド)
- 複数機能を跨ぐ整合性やトランザクションを保つ仕組みがない
- 開発時に多言語で実装したは良いが、保守時に人員・スキル不足に陥りやすい
参考:http://album.cloudit.co.jp/?p=5212
ドメイン駆動開発
システムで解決したい業務フロー(=ドメイン)の掘り下げを徹底的に業務フローの有識者(=ドメインエキスパート)と行い、
業務フローのシステム解決に必要な情報を抽出し(モデリング)、
既存の優秀なドメイン駆動開発で採用されているデザインパターンを積極的に採用して(EntityやRepository等。戦略的DDDと呼ぶ)、モデリングから利益を最大限に得る開発手法。
メリット
- ドメインの徹底的な掘り下げによってサービスをモデリングしているのでブレない
- 戦略的DDDで開発コストやメンテナンス性を向上させている
デメリット
- ドメインの掘り下げに非常に時間がかかる。掘り下げが甘いと機能追加や変更でシステム崩壊。
参考:https://qiita.com/little_hand_s/items/721afcbc555444663247
マイクロサービスアーキテクチャ の ドメイン駆動開発の目立った差異
1.準備段階の違い
ドメイン駆動は課題解決を注視しており、マイクロサービスは変化に強いサービスであることを注視している。
ドメイン駆動はウォーターフォールチックでドメインを抽出することに慎重に時間をかける。
かっちりドメインが固まってから動き出す。
対して、
マイクロサービスはアジャイルチックで機能ごとにアプリケーションが違うからこそ、
大元の要件がある程度決まったら直ぐに動き出せるフットワークの軽さがある。
2.システム構成の違い
マイクロサービスは機能ごとにアプリケーションが分かれている。
対して、
ドメイン駆動は機能ごとに分けたりせず、基本的に1つのアプリケーションに纏まっている。
3.メンテナンス性が高い理由の違い
マイクロサービスは、機能ごとにアプリケーションが分かれており、互いに依存しないからこそ改修や機能追加が容易。
ドメイン駆動はモデリングをかっちりやって土台が固まり、過去実績のある技術を活用している→どんな仕様追加も問題ない、という理屈。
最後に
簡単ですが上記のように理解しております。
個人的にはドメイン駆動開発の方が好みです!