本ページについて
モノリスからマイクロサービスへ
――モノリスを進化させる実践移行ガイド
2020/12 O'Reilly Japan より翻訳版が発売されました。
ざっとおさらいする様に、同書のポイントと関連する記事をまとめたリファレンス記事となります。
※ 以下、ポイント選出や参考Webリンクの結びつきは個人の見解であり、O'Reilly Japanおよび著者とは一切関係ありません。
マイクロサービスとは
ポイント1.独立デプロイ可能であること(1.1.1)
- マイクロサービスの本質は独立デプロイ可能であることと定義している
- 一方で、データベースの共有やサービス境界の発見など独立デプロイの道は平坦ではない
- 参考:マイクロサービスアーキテクチャとそれを支える技術
ポイント2.コンウェイの法則(1.1.2)
- 「システムを設計する組織は、その構造をそっくりまねた構造の設計を生み出してしまう」という法則のこと
- 組織構造がビジネス視点で凝集していない場合、マイクロサービス化の恩恵を受けにくくなってしまう
- 参考:コンウェイの法則と逆コンウェイの法則から組織構造を考える
ポイント3.マイクロサービスは銀の弾丸ではない(1.1.4, 1.1.5)
- マイクロサービス化することで複雑になる問題も存在する
- 参考:マイクロサービス・アーキテクチャのメリット/デメリットまとめ
- 参考:マイクロサービスアーキテクチャとは何か
ポイント4.マイクロなサイズに拘らない(1.1.8)
- あるサービスが「大きい」か「小さい」かは、人や状況に依存する
- それよりも「自分達の扱えるサービス数はどれくらいか」「サービスの境界が良い感じになる分界点はどこか」に注力すべき
- 参考:マイクロサービス 4つの分割アプローチ
モノリスとは
ポイント5.単一プロセスのモノリス(1.2.1)
- すべてのコードが単一のプロセスとしてデプロイされているシステムのこと
- 後続のモジュラーモノリス等と違い、モノリス内の構造化が出来ていないモノリスを指す
- 現在人々が苦労しているシステムの大半はこのパターンに当てはまると予想される
ポイント6.モジュラーモノリス(1.2.1)
- 単一のプロセスが別々のモジュールで分割されたモノリスのこと
- マイクロサービスの持つ技術課題を避けつつ既存システムの課題を解決する策として有効な場合がある
- Shopifyの成功事例が有名(参考:[翻訳] Shopifyにおけるモジュラモノリスへの移行)
ポイント7.分散モノリス(1.2.2)
- 分散システムの欠点とモノリスの欠点の両方を持つとされるアンチパターン
- 独立デプロイを守らずマイクロサービス同士が密結合になっていることで発生する
- 参考:分散されたモノリスになってしまうマイクロサービス
ポイント8.モノリス≠レガシー(1.2.4, 1.2.5)
- モジュラーモノリスの成功例に代表される様にモノリスにも利点がある
- モノリス即レガシーと決めつけず、何を得て何を失うかを理解する事が肝要
- 参考:マイクロサービス化で得ること、失うこと
凝集と結合
ポイント9.凝集(1.3.1)
- 関連する機能と情報がどの程度集約されているか(分散してしまっているか)を表したもの
- 凝集度が高ければ高いほど人間にとって判り易く良いとされる
- 参考:凝集度と結合度について
ポイント10.結合(1.3.2)
- コンポーネントやデータなどソフトウェアの複数の実装同士の結びつきを表すもの
- 結合には複数のレベルがあり、なるべく結合レベルを低くすることが望ましい
- 参考:凝集度と結合度:このコードのどこが悪いのか?
ドメイン駆動設計
ポイント11.集約(1.4.1)
- ドメイン駆動設計における複数のオブジェクト間の状態を矛盾させないための設計思想
- マイクロサービスにおいても複数サービス間の状態が矛盾しない様に似た考慮が必要になる
- 参考:リアクティブマイクロサービス入門(2/2)- 実現編
ポイント12.境界づけられたコンテキスト(1.4.2)
- 集約よりも大きな単位の組織境界を表したもの
- この境界づけられたコンテキストをマイクロサービスの単位にする考え方がある
- 参考:DDDの構成要素とマイクロサービスの単位をどう合わせるべきか