システム構築技術を俯瞰する(マイクロサービスアーキテクチャ 第2版)
マイクロサービスアーキテクチャ 第2版
- Sam Newman (著), 佐藤 直生 (監修), 木下 哲也 (翻訳)
- 発売日:2022/12/2
前回、前々回と文字コード関係の本が続きましたが、今回はシステム構築系の本です。
私はマイクロサービスアーキテクチャの初版を読んでいたのですが、ある調べものがあって読み返したことがきっかけで、新しい版が無いか探してみると、出てました(笑)。
この本の主題はマイクロサービスですが、初版の時から、マイクロサービスに特化した技術本というよりは、システム構築技術に関するカタログ本のような内容です。
このため、マイクロサービスに興味は無くても、システム構築に関わる人には有意な情報が書かれている本だと思います。
初版でも300ページくらいあるボリュームでしたが、第2版は最近の状況を反映して、その倍の600ページのボリュームになっています。
第2版も買ってよかったなと思える内容でしたので、書き留めておくことにしました。
<本の内容>
下記の目次を見ても分かる通り、この本は、設計から実装技術、セキュリティ、運用監視、組織のあり方まで、マイクロサービスに関連する話題をとても幅広く取り上げています。
【目次】
- はじめに
- 第Ⅰ部 基礎
- 1章 マイクロサービスとは
- 1.1 マイクロサービスの概要
- 1.2 マイクロサービスの重要な概念
- 1.3 モノリス
- 1.4 実現技術
- 1.5 マイクロサービスの利点
- 1.6 マイクロサービスの課題
- 1.7 マイクロサービスを使うべきか
- 1.8 まとめ
- 2章 マイクロサービスのモデル化
- 2.1 MusicCorpの紹介
- 2.2 適切なマイクロサービス境界にするには
- 2.3 結合の種類
- 2.4 過不足のないドメイン駆動設計(DDD)
- 2.5 マイクロサービス向けのドメイン駆動設計(DDD)の例
- 2.6 ビジネスドメイン境界の代替手段
- 2.7 混合モデルと例外
- 2.8 まとめ
- 3章 モノリスの分割
- 3.1 目標を持つ
- 3.2 漸進的な移行
- 3.3 ほとんどの場合、モノリスは敵ではない
- 3.4 まず何を分割すべきか
- 3.5 階層による分解
- 3.6 便利な分解パターン
- 3.7 データ分解における懸念
- 3.8 まとめ
- 4章 マイクロサービスの通信スタイル
- 4.1 プロセス内からプロセス間へ
- 4.2 プロセス間通信のための技術:多数の選択肢
- 4.3 マイクロサービスの通信スタイル
- 4.4 パターン:同期ブロッキング
- 4.5 パターン:非同期非ブロッキング
- 4.6 パターン:共通データを介した通信
- 4.7 パターン:リクエスト/レスポンス通信
- 4.8 パターン:イベント駆動通信
- 4.9 注意深く進める
- 4.10 まとめ
- 第Ⅱ部 実装
- 5章 マイクロサービスの通信の実装
- 5.1 理想的な技術の探索
- 5.2 技術選択
- 5.3 シリアライゼーション形式
- 5.4 スキーマ
- 5.5 マイクロサービス間の変更に対処する
- 5.6 破壊的変更の回避
- 5.7 破壊的変更の管理
- 5.8 マイクロサービスの世界における、DRYとコード再利用の危険性
- 5.9 サービス検出
- 5.10 サービスメッシュとAPIゲートウェイ
- 5.11 サービスの文書化
- 5.12 まとめ
- 6章 ワークフロー
- 6.1 データベーストランザクション
- 6.2 分散トランザクション:2フェーズコミット
- 6.3 分散トランザクションはお断り
- 6.4 サーガ
- 6.5 まとめ
- 7章 ビルド
- 7.1 継続的インテグレーション(CI)とは
- 7.2 ビルドパイプラインと継続的デリバリ(CD)
- 7.3 ソースコードとビルドのマイクロサービスへのマッピング
- 7.4 まとめ
- 8章 デプロイ
- 8.1 論理から物理へ
- 8.2 マイクロサービスのデプロイの原則
- 8.3 デプロイの選択肢
- 8.4 どのデプロイオプションが自分に適しているか
- 8.5 Kubernetesとコンテナオーケストレーション
- 8.6 プログレッシブデリバリ
- 8.7 まとめ
- 9章 テスト
- 9.1 テストの種類
- 9.2 テストスコープ
- 9.3 サービステストの実装
- 9.4 (扱いにくい)エンドツーエンドテストの実装
- 9.5 エンドツーエンドテストを避けるべきか
- 9.6 開発者体験
- 9.7 本番前環境でのテストから本番環境でのテストへ
- 9.8 機能横断テスト
- 9.9 まとめ
- 10章 監視から可観測性へ
- 10.1 断絶、パニック、混乱
- 10.2 単一マイクロサービス、単一サーバ
- 10.3 単一マイクロサービス、複数サーバ
- 10.4 複数マイクロサービス、複数サーバ
- 10.5 可観測性と監視の違い
- 10.6 可観測性の構成要素
- 10.7 標準化
- 10.8 ツールの選択
- 10.9 マシン内の専門家
- 10.10 開始する
- 10.11 まとめ
- 11章 セキュリティ
- 11.1 基本原則
- 11.2 サイバーセキュリティの5つの機能
- 11.3 アプリケーションセキュリティの基礎
- 11.4 暗黙の信頼とゼロトラスト
- 11.5 データをセキュアにする
- 11.6 認証認可
- 11.7 まとめ
- 12章 レジリエンス
- 12.1 レジリエンスとは
- 12.2 障害はどこにでもある
- 12.3 どの程度が多すぎるのか
- 12.4 機能低下
- 12.5 安定性パターン
- 12.6 危険性の分散
- 12.7 CAP定理
- 12.8 カオスエンジニアリング
- 12.9 非難
- 12.10 まとめ
- 13章 スケーリング
- 13.1 スケーリングの4つの軸
- 13.2 モデルの組み合わせ
- 13.3 小さく始める
- 13.4 キャッシュ
- 13.5 オートスケーリング
- 13.6 再出発
- 13.7 まとめ
- 第Ⅲ部 人
- 14章 UI
- 14.1 デジタルへ向けて
- 14.2 所有権モデル
- 14.3 ストリームアラインドチームを目指して
- 14.4 パターン:モノリシックフロントエンド
- 14.5 パターン:マイクロフロントエンド
- 14.6 パターン:ページベースの分解
- 14.7 パターン:ウィジェットベースの分解
- 14.8 制約
- 14.9 パターン:中央集約ゲートウェイ
- 14.10 パターン:BFF(フロントエンド向けのバックエンド)
- 14.11 GraphQL
- 14.12 ハイブリッドなアプローチ
- 14.13 まとめ
- 15章 組織構造
- 15.1 疎結合の組織
- 15.2 コンウェイの法則
- 15.3 チームサイズ
- 15.4 コンウェイの法則を理解する
- 15.5 小さなチーム、大きな組織
- 15.6 自律性
- 15.7 強い所有権と共同所有権の比較
- 15.8 イネイブリングチーム
- 15.9 共有マイクロサービス
- 15.10 社内オープンソース
- 15.11 プラグ可能なモジュラーマイクロサービス
- 15.12 孤立したサービス
- 15.13 ケーススタディ:realestate.com.au
- 15.14 地理的分散
- 15.15 逆コンウェイの法則
- 15.16 人
- 15.17 まとめ
- 16章 進化的アーキテクト
- 16.1 「名前が何だと言うの」
- 16.2 ソフトウェアアーキテクチャとは
- 16.3 変更を可能にする
- 16.4 進化するアーキテクト像
- 16.5 システム境界の定義
- 16.6 社会的構成概念
- 16.7 居住性
- 16.8 原則に基づいたアプローチ
- 16.9 進化的アーキテクチャへの指針
- 16.10 ストリームアラインド組織でのアーキテクチャ
- 16.11 チームの構築
- 16.12 必要な標準
- 16.13 ガバナンスと舗装道路
- 16.14 技術的負債
- 16.15 例外処理
- 16.16 まとめ
- あとがき:すべてをまとめる
<感想>
ソフトウェア関連知識において、この本で取り上げられていないのは、例えば、設計前の要求レベルのことや、サービス内の実装(例えばプログラミングレベル)、見積もりなどを含めたプロジェクト管理面くらいではないかと思ってしまいます。
全ての内容に精通することは、私には不可能ですが、個々の側面でどのような課題や解決策があるのかを把握しておくことはとても有意義な事だと思っています。
具体的には、個別最適に陥りがちなところを全体最適の観点から見直すヒントになると思っています。
ところで、この600ページもある本を読むのは苦痛なのか?というと、そんなことはありません。
これにはいくつか理由があると思いますが、私が感じたことを書いてみます。
まず、著者が執筆した理由として以下のように書いています。
- マイクロサービスに「賛成」でも「反対」でもありません。ただ、このアイディアが功を奏する状況を探求し、引き起こされる恐れのある問題を共有したいのです
このような立場もあってか、マイクロサービス至上主義?的な話の展開ではなく、マイクロサービスに限らず、システム構築に必要な技術、事柄を幅広く俯瞰している本という印象です。
私個人としては、「マイクロサービス」とか「モノリス」という概念には興味は無くて、目標とするシステムをどのように作るのが良いか?ということに興味があるだけなのですが、この本は、そういった要求に見合ったシステムを構築するためのバリエーションと指針を与えてくれる本のように思います。
話の進み方としては、モノリス的な構成から始めてマイクロサービス的な構成を示し、それぞれの利点と欠点、著者の好み?などが書かれています。
読んでいると、自分が直面する現実的な課題も多いので、ページ数が多いと感じるよりも、もっと踏み込んで書いて欲しいと思うことが多いです(笑)。
これとは逆に、広く話題を取り上げている一方で、個々の話題にはあまり深入りしていません。深入りしない代わりに、著者がお勧めする書籍やURL(リンク)などが書かれています。
例えば、ドメイン駆動設計についても触れられていますが、この本でドメイン駆動設計のことが理解できるというものではありません。
そのかわり、マイクロサービスのモデル化にドメイン駆動設計が有効である理由や例などが書かれています。
全体として、難しい詳細に入る前に切り上げて次の話題にテンポよく移っていく印象がありますので、読み進めるのが苦痛に感じないのかもしれません。
個人的な印象ですが、この本はシステム構築に関する技術を俯瞰的に紹介する本、あるいは利用可能なパターンのカタログだと思っています。
さて、この本が設計や技術面だけでなく、組織なども取り上げている理由は、設計や実装、運用、組織などが、それぞれ完全に独立した話題ではなく、結局のところ、人(組織構造)に依存するということかと思います。
これは初版から「コンウェイの法則」を取り上げて話を展開しています。
コンウェイの法則は、以下のように説明されています。
- (情報システムだけではなく、より広い意味で定義された)システムを設計するあらゆる組織は、その構造がその組織のコミュニケーション構造の複製となるような設計を、必然的に生み出す。
例えば「コンパイラの開発を担当する4つのグループがあれば、4パスコンパイラが得られる」とのことです(笑)。
考えてみると、マイクロサービスはいわば分散システムの一形態であり、分散システムはサービス間の通信(相互作用)を伴うので、そのサービスの役割や通信も、組織構造に影響を受ける可能性が高いことは、これまでの経験でも実感するところがあります。(何らかの心理バイアスかもしれませんが。)
逆に考えると、目標とするシステムの構成があるのであれば、その構成に見合った組織構成にする必要がありそうです。
その点で、この本に書かれている技術的なパターンを、組織構造毎に生み出される典型的な構成とか、組織構造にマッチした構成のカタログとしてまとめなおすと面白そうだと思いました(怖い感じもしますが。。。)。
その他、個別の内容を書き始めると終わりませんので、最後に初版との違いをメモしておきます。
まず、話の骨格は大きく変わっていない気がしますが、(節レベルの内容が章レベルの内容になったり)個々の内容が最近の技術内容を踏まえて、大きく加筆されています。
それ以外、大したことではないのですが、私が気付いた点は、まず初版のカバーはモノクロでした。
それが第2版では、図柄は微妙に違いながらもほぼ同じですが、カラーになりました(笑)。
それはともかく、このような技術を幅広く俯瞰してくれる本は貴重だと思います。
数年後に、その時の技術動向が反映された第3版がでることを期待しています。
そしてそのころには、AI的な内容が入り込んでいたりして。。。
関連記事
- Distributed Systems / 分散システム ― 原理とパラダイム
- アジャイルに一貫したモデリングから実装を維持する方法を知る本(エリック・エヴァンスのドメイン駆動設計)
- JavaScriptで学ぶ関数型プログラミング
- 安全な委譲の仕組みを理解する(OAuth徹底入門)
- クエリのような API に入門する:初めてのGraphQL
- REA パターンとオントロジー(ビジネスパターンによるモデル駆動設計)
- 究極のモデリング(オントロジー工学)
- ソフトウェア開発のあるある問題と解決策(アンチパターン)
- ソフトウェア開発を社会学的な観点から考える本(ピープルウェア)
- ソフトウェア開発の本質的な課題を知る本(人月の神話)
コメント
コメントを投稿