マイクロサービスアーキテクチャ 第2版

[cover photo]
TOPICS
System/Network
発行年月日
PRINT LENGTH
664
ISBN
978-4-8144-0001-0
原書
Building Microservices, 2nd Edition
FORMAT
Print PDF EPUB
Ebook
4,400円
Ebookを購入する
Print
4,400円

2014年にThoughtworksのマーチン・ファウラーとジェームス・ルイスによって提唱された「マイクロサービス」は、いまではすっかり市民権を得て、さまざまな手法やツールが開発されています。著者は、マイクロサービスに「賛成」でも「反対」でもないという中立的な立場から、マイクロサービスの仕組み、特徴、長所、短所、課題を丁寧に説明しています。Thoughtworks在籍中から数多くのマイクロサービスプロジェクトに携わっていた著者が共有する、自身の実体験から得た多くの知見は、システム設計、開発、デプロイ、テストといった技術的側面のみならず、人材をどのように活かし、生産性を上げるかといった組織面にも多くの示唆を与えてくれるものです。組織に適したアーキテクチャを選択し、信頼性が高く、堅牢性、安全性、柔軟性に優れたシステムを設計する上で指針となる一冊です。

目次

はじめに

第Ⅰ部 基礎

1章 マイクロサービスとは
    1.1 マイクロサービスの概要
    1.2 マイクロサービスの重要な概念
        1.2.1 独立デプロイ可能性
        1.2.2 ビジネスドメインに基づくモデル化
        1.2.3 マイクロサービスごとの状態の所有
        1.2.4 サイズ
        1.2.5 柔軟性
        1.2.6 アーキテクチャと組織の連携
    1.3 モノリス
        1.3.1 単一プロセスモノリス
        1.3.2 モジュラーモノリス
        1.3.3 分散モノリス
        1.3.4 モノリスとデリバリ競合
        1.3.5 モノリスの利点
    1.4 実現技術
        1.4.1 ログ集約と分散トレーシング
        1.4.2 コンテナとKubernetes
        1.4.3 ストリーミング
        1.4.4 パブリッククラウドとサーバレス
    1.5 マイクロサービスの利点
        1.5.1 技術の異種性
        1.5.2 堅牢性
        1.5.3 スケーリング
        1.5.4 デプロイの容易性
        1.5.5 組織との連携
        1.5.6 合成可能性
    1.6 マイクロサービスの課題
        1.6.1 開発者体験
        1.6.2 技術の過負荷
        1.6.3 コスト
        1.6.4 レポート
        1.6.5 監視とトラブルシューティング
        1.6.6 セキュリティ
        1.6.7 テスト
        1.6.8 遅延
        1.6.9 データ一貫性
    1.7 マイクロサービスを使うべきか
        1.7.1 役立たない場合
        1.7.2 効果的な場所
    1.8 まとめ

2章 マイクロサービスのモデル化
    2.1 MusicCorpの紹介
    2.2 適切なマイクロサービス境界にするには
        2.2.1 情報隠蔽
        2.2.2 凝集
        2.2.3 結合
        2.2.4 結合と凝集の相互関係
    2.3 結合の種類
        2.3.1 ドメイン結合
        2.3.2 パススルー結合
        2.3.3 共通結合
        2.3.4 内容結合
    2.4 過不足のないドメイン駆動設計(DDD)
        2.4.1 ユビキタス言語
        2.4.2 アグリゲート(集約)
        2.4.3 境界づけられたコンテキスト(コンテキスト境界)
        2.4.4 アグリゲート、境界づけられたコンテキストのマイクロサービスへのマッピング
        2.4.5 イベントストーミング
    2.5 マイクロサービス向けのドメイン駆動設計(DDD)の例
    2.6 ビジネスドメイン境界の代替手段
        2.6.1 変動性
        2.6.2 データ
        2.6.3 技術
        2.6.4 組織
    2.7 混合モデルと例外
    2.8 まとめ

3章 モノリスの分割
    3.1 目標を持つ
    3.2 漸進的な移行
    3.3 ほとんどの場合、モノリスは敵ではない
        3.3.1 時期尚早な分解の危険性
    3.4 まず何を分割すべきか
    3.5 階層による分解
        3.5.1 コードファースト
        3.5.2 データファースト
    3.6 便利な分解パターン
        3.6.1 ストラングラーフィグパターン
        3.6.2 並列実行
        3.6.3 機能トグル
    3.7 データ分解における懸念
        3.7.1 パフォーマンス
        3.7.2 データ完全性
        3.7.3 トランザクション
        3.7.4 ツール
        3.7.5 レポートデータベース
    3.8 まとめ

4章 マイクロサービスの通信スタイル
    4.1 プロセス内からプロセス間へ
        4.1.1 パフォーマンス
        4.1.2 インタフェースの変更
        4.1.3 エラー処理
    4.2 プロセス間通信のための技術:多数の選択肢
    4.3 マイクロサービスの通信スタイル
        4.3.1 うまく組み合わせる
    4.4 パターン:同期ブロッキング
        4.4.1 利点
        4.4.2 欠点
        4.4.3 同期ブロッキングの用途
    4.5 パターン:非同期非ブロッキング
        4.5.1 利点
        4.5.2 欠点
        4.5.3 非同期非ブロッキングの用途
    4.6 パターン:共通データを介した通信
        4.6.1 実装
        4.6.2 利点
        4.6.3 欠点
        4.6.4 共通データを介した通信の用途
    4.7 パターン:リクエスト/レスポンス通信
        4.7.1 実装:同期と非同期
        4.7.2 リクエスト/レスポンス通信の用途
    4.8 パターン:イベント駆動通信
        4.8.1 実装
        4.8.2 イベントの中身
        4.8.3 イベント駆動通信の用途
    4.9 注意深く進める
    4.10 まとめ

第Ⅱ部 実装

5章 マイクロサービスの通信の実装
    5.1 理想的な技術の探索
        5.1.1 後方互換性を容易にする
        5.1.2 インタフェースを明示的にする
        5.1.3 APIを技術非依存にする
        5.1.4 コンシューマにとって単純なサービスにする
        5.1.5 内部実装の詳細を隠す
    5.2 技術選択
        5.2.1 リモートプロシージャコール(RPC)
        5.2.2 REST
        5.2.3 GraphQL
        5.2.4 メッセージブローカー
    5.3 シリアライゼーション形式
        5.3.1 テキスト形式
        5.3.2 バイナリ形式
    5.4 スキーマ
        5.4.1 契約の構造的破壊と意味的破壊
        5.4.2 スキーマを使うべきか
    5.5 マイクロサービス間の変更に対処する
    5.6 破壊的変更の回避
        5.6.1 拡張変更
        5.6.2 耐性のあるリーダー
        5.6.3 適切な技術
        5.6.4 明示的なインタフェース
        5.6.5 偶発的な破壊的変更の早期把握
    5.7 破壊的変更の管理
        5.7.1 ロックステップデプロイ
        5.7.2 互換性のないマイクロサービスバージョンの共存
        5.7.3 旧インタフェースのエミュレーション
        5.7.4 どちらのアプローチが好ましいか
        5.7.5 社会契約
        5.7.6 利用の追跡
        5.7.7 極端な手段
    5.8 マイクロサービスの世界における、DRYとコード再利用の危険性
        5.8.1 ライブラリを介したコード共有
    5.9 サービス検出
        5.9.1 ドメインネームシステム(DNS)
        5.9.2 動的サービスレジストリ
        5.9.3 人を忘れない
    5.10 サービスメッシュとAPIゲートウェイ
        5.10.1 APIゲートウェイ
        5.10.2 サービスメッシュ
        5.10.3 他のプロトコルはどうか
    5.11 サービスの文書化
        5.11.1 明示的なスキーマ
        5.11.2 自己記述型システム
    5.12 まとめ

6章 ワークフロー
    6.1 データベーストランザクション
        6.1.1 ACIDトランザクション
        6.1.2 ACIDでも、原子性に欠けるのか
    6.2 分散トランザクション:2フェーズコミット
    6.3 分散トランザクションはお断り
    6.4 サーガ
        6.4.1 サーガの障害モード
        6.4.2 サーガの実装
        6.4.3 サーガと分散トランザクションの比較
    6.5 まとめ

7章 ビルド
    7.1 継続的インテグレーション(CI)とは
        7.1.1 本当にCIを行っているか
        7.1.2 ブランチモデル
    7.2 ビルドパイプラインと継続的デリバリ(CD)
        7.2.1 ツール
        7.2.2 トレードオフと環境
        7.2.3 成果物の作成
    7.3 ソースコードとビルドのマイクロサービスへのマッピング
        7.3.1 1つの巨大リポジトリ、1つの巨大ビルド
        7.3.2 パターン:マイクロサービスごとに1つのリポジトリ(別名マルチリポ)
        7.3.3 パターン:モノリポ
        7.3.4 どの方法を使うべきか
    7.4 まとめ

8章 デプロイ
    8.1 論理から物理へ
        8.1.1 複数インスタンス
        8.1.2 データベース
        8.1.3 環境
    8.2 マイクロサービスのデプロイの原則
        8.2.1 分離された実行
        8.2.2 自動化の重視
        8.2.3 IaC(コードとしてのインフラ)
        8.2.4 停止時間のないデプロイ
        8.2.5 望ましい状態の管理
    8.3 デプロイの選択肢
        8.3.1 物理マシン
        8.3.2 仮想マシン(VM)
        8.3.3 コンテナ
        8.3.4 アプリケーションコンテナ
        8.3.5 PaaS(Platform as a Service、サービスとしてのプラットフォーム)
        8.3.6 FaaS(Function as a Service、サービスとしての関数)
    8.4 どのデプロイオプションが自分に適しているか
    8.5 Kubernetesとコンテナオーケストレーション
        8.5.1 コンテナオーケストレーションの例
        8.5.2 Kubernetesの概念の簡略図
        8.5.3 マルチテナントとフェデレーション
        8.5.4 CNCF(Cloud Native Computing Foundation)
        8.5.5 プラットフォームと移植性
        8.5.6 Helm、Operator、CRD
        8.5.7 Knative
        8.5.8 将来
        8.5.9 Kubernetesを使うべきか
    8.6 プログレッシブデリバリ
        8.6.1 デプロイとリリースの分離
        8.6.2 プログレッシブデリバリへの移行
        8.6.3 機能トグル
        8.6.4 カナリアリリース
        8.6.5 並列実行
    8.7 まとめ

9章 テスト
    9.1 テストの種類
    9.2 テストスコープ
        9.2.1 単体テスト
        9.2.2 サービステスト
        9.2.3 エンドツーエンドテスト
        9.2.4 トレードオフ
    9.3 サービステストの実装
        9.3.1 モックかスタブか
        9.3.2 高度なスタブサービス
    9.4 (扱いにくい)エンドツーエンドテストの実装
        9.4.1 信頼できない脆弱なテスト
        9.4.2 誰がエンドツーエンドテストを書くか
        9.4.3 エンドツーエンドテストの実行期間
        9.4.4 積み上がる大きな山
        9.4.5 メタバージョン
        9.4.6 独立テスト容易性の欠如
    9.5 エンドツーエンドテストを避けるべきか
        9.5.1 契約テストとコンシューマ駆動契約(CDC)
        9.5.2 結論
    9.6 開発者体験
    9.7 本番前環境でのテストから本番環境でのテストへ
        9.7.1 本番環境でのテストの種類
        9.7.2 本番環境でのテストを安全にする
        9.7.3 平均故障間隔(MTBF)よりも平均修復時間(MTTR)か
    9.8 機能横断テスト
        9.8.1 パフォーマンステスト
        9.8.2 堅牢性テスト
    9.9 まとめ

10章 監視から可観測性へ
    10.1 断絶、パニック、混乱
    10.2 単一マイクロサービス、単一サーバ
    10.3 単一マイクロサービス、複数サーバ
    10.4 複数マイクロサービス、複数サーバ
    10.5 可観測性と監視の違い
        10.5.1 可観測性の柱?あまり高速ではない
    10.6 可観測性の構成要素
        10.6.1 ログ集約
        10.6.2 メトリック集約
        10.6.3 分散トレーシング
        10.6.4 うまくいっているか
        10.6.5 アラート
        10.6.6 セマンティック監視
        10.6.7 本番環境でのテスト
    10.7 標準化
    10.8 ツールの選択
        10.8.1 大衆性
        10.8.2 統合しやすさ
        10.8.3 コンテキストの提供
        10.8.4 リアルタイム
        10.8.5 自分たちの規模に合っている
    10.9 マシン内の専門家
    10.10 開始する
    10.11 まとめ

11章 セキュリティ
    11.1 基本原則
        11.1.1 最小権限の原則
        11.1.2 多層防御
        11.1.3 自動化
        11.1.4 デリバリプロセスへのセキュリティの組み込み
    11.2 サイバーセキュリティの5つの機能
        11.2.1 特定
        11.2.2 保護
        11.2.3 検知
        11.2.4 対応
        11.2.5 復旧
    11.3 アプリケーションセキュリティの基礎
        11.3.1 資格情報(クレデンシャル)
        11.3.2 パッチ適用
        11.3.3 バックアップ
        11.3.4 再構築
    11.4 暗黙の信頼とゼロトラスト
        11.4.1 暗黙の信頼
        11.4.2 ゼロトラスト
        11.4.3 併用のバリエーション
    11.5 データをセキュアにする
        11.5.1 転送データ
        11.5.2 保存データ
    11.6 認証認可
        11.6.1 サービス間認証
        11.6.2 人の認証
        11.6.3 一般的なシングルサインオン(SSO)の実装
        11.6.4 シングルサインオン(SSO)ゲートウェイ
        11.6.5 粒度の細かい認可
        11.6.6 混乱した代理問題
        11.6.7 一元的な上流での認可
        11.6.8 認可の分散化
        11.6.9 JSON Web Token(JWT)
    11.7 まとめ

12章 レジリエンス
    12.1 レジリエンスとは
        12.1.1 堅牢性
        12.1.2 回復性
        12.1.3 グレースフルな拡張性
        12.1.4 持続的な適応性
        12.1.5 そして、マイクロサービスアーキテクチャ
    12.2 障害はどこにでもある
    12.3 どの程度が多すぎるのか
    12.4 機能低下
    12.5 安定性パターン
        12.5.1 タイムアウト
        12.5.2 再試行(リトライ)
        12.5.3 バルクヘッド
        12.5.4 サーキットブレーカー
        12.5.5 分離性
        12.5.6 冗長性
        12.5.7 ミドルウェア
        12.5.8 冪等性
    12.6 危険性の分散
    12.7 CAP定理
        12.7.1 一貫性を犠牲にする
        12.7.2 可用性を犠牲にする
        12.7.3 分断耐性を犠牲にするか
        12.7.4 APかCPか
        12.7.5 オールオアナッシングではない
        12.7.6 そして実世界
    12.8 カオスエンジニアリング
        12.8.1 ゲームデイ
        12.8.2 本番環境実験
        12.8.3 堅牢性の先へ
    12.9 非難
    12.10 まとめ

13章 スケーリング
    13.1 スケーリングの4つの軸
        13.1.1 垂直スケーリング
        13.1.2 水平複製
        13.1.3 データのパーティション分割
        13.1.4 機能分解
    13.2 モデルの組み合わせ
    13.3 小さく始める
    13.4 キャッシュ
        13.4.1 パフォーマンスのためのキャッシュ
        13.4.2 スケールのためのキャッシュ
        13.4.3 堅牢性のためのキャッシュ
        13.4.4 どこでキャッシュするか
        13.4.5 無効化
        13.4.6 キャッシュの黄金律
        13.4.7 鮮度と最適化
        13.4.8 キャッシュポイズニング:教訓
    13.5 オートスケーリング
    13.6 再出発
    13.7 まとめ

第Ⅲ部 人

14章 UI
    14.1 デジタルへ向けて
    14.2 所有権モデル
        14.2.1 専任フロントエンドチームに向かう要因
    14.3 ストリームアラインドチームを目指して
        14.3.1 専門家の共有
        14.3.2 一貫性の保証
        14.3.3 技術的課題の克服
    14.4 パターン:モノリシックフロントエンド
        14.4.1 モノリシックフロントエンドを使う場合
    14.5 パターン:マイクロフロントエンド
        14.5.1 実装
        14.5.2 マイクロフロントエンドを使う場合
    14.6 パターン:ページベースの分解
        14.6.1 ページベースの分解の用途
    14.7 パターン:ウィジェットベースの分解
        14.7.1 実装
        14.7.2 ウィジェットベースの分解を使う場合
    14.8 制約
    14.9 パターン:中央集約ゲートウェイ
        14.9.1 所有権
        14.9.2 各種のUI
        14.9.3 複数の懸念
        14.9.4 中央集約ゲートウェイを使う場合
    14.10 パターン:BFF(フロントエンド向けのバックエンド)
        14.10.1 BFFをいくつにするか
        14.10.2 再利用とBFF
        14.10.3 デスクトップWebなどのためのBFF
        14.10.4 BFFを使う場合
    14.11 GraphQL
    14.12 ハイブリッドなアプローチ
    14.13 まとめ

15章 組織構造
    15.1 疎結合の組織
    15.2 コンウェイの法則
        15.2.1 証拠
    15.3 チームサイズ
    15.4 コンウェイの法則を理解する
    15.5 小さなチーム、大きな組織
    15.6 自律性
    15.7 強い所有権と共同所有権の比較
        15.7.1 強い所有権
        15.7.2 共同所有権
        15.7.3 チームレベルと組織レベルの比較
        15.7.4 モデル間のバランスを取る
    15.8 イネイブリングチーム
        15.8.1 実践コミュニティ
        15.8.2 プラットフォーム
    15.9 共有マイクロサービス
        15.9.1 分割が難しすぎる
        15.9.2 横断的変更
        15.9.3 デリバリのボトルネック
    15.10 社内オープンソース
        15.10.1 コアコミッターの役割
        15.10.2 成熟度
        15.10.3 ツール
    15.11 プラグ可能なモジュラーマイクロサービス
        15.11.1 変更のレビュー
    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.8.1 戦略的目標
        16.8.2 原則
        16.8.3 プラクティス
        16.8.4 原則とプラクティスの結合
        16.8.5 実世界の例
    16.9 進化的アーキテクチャへの指針
    16.10 ストリームアラインド組織でのアーキテクチャ
    16.11 チームの構築
    16.12 必要な標準
        16.12.1 監視
        16.12.2 インタフェース
        16.12.3 アーキテクチャ上の安全性
    16.13 ガバナンスと舗装道路
        16.13.1 見本
        16.13.2 カスタマイズされたマイクロサービステンプレート
        16.13.3 大規模での舗装道路
    16.14 技術的負債
    16.15 例外処理
    16.16 まとめ

あとがき:すべてをまとめる
   マイクロサービスとは
   マイクロサービスへの移行
   通信スタイル
   ワークフロー
   ビルド
   デプロイ
   テスト
   監視と可観測性
   セキュリティ
   レジリエンス
   スケーリング
   UI
   組織
   アーキテクチャ
   参考文献
   今後について
   最後に

参考文献
用語集
索引