Upgrade to Pro — share decks privately, control downloads, hide ads and more …

30分でわかるマイクロサービスアーキテクチャ 第2版

30分でわかるマイクロサービスアーキテクチャ 第2版

30分でわかるマイクロサービスアーキテクチャ 第2版 - Forkwell Library #17
https://forkwell.connpass.com/event/273812/
https://www.youtube.com/watch?v=xYTtw0ZgUNU

オライリー・ジャパン > マイクロサービスアーキテクチャ 第2版
https://www.oreilly.co.jp/books/9784814400010/

SATO Naoki (Neo)

February 21, 2023
Tweet

More Decks by SATO Naoki (Neo)

Other Decks in Technology

Transcript

  1. タイムライン 2011-2012 「マイクロサービス」 (microservices) という 用語が登場 Microservices - Wikipedia 2014

    martinfowler.com に 「Microservices」ページが登 場 (James Lewis, Martin Fowler) Microservices (martinfowler.com) 2015-2016 書籍「Building Microservices」出版 日本語版「マイクロサービ スアーキテクチャ」出版 2021-2022 書籍「Building Microservices, 2nd Edition」出版 日本語版「マイクロサービ スアーキテクチャ 第2版」 出版
  2. 本書の構成 第2版 • 第Ⅰ部 基礎 • 1章 マイクロ サービスとは •

    2章 マイクロサー ビスのモデル化 • 3章 モノリスの 分割 • 4章 マイクロ サービスの 通信スタイル • 第Ⅱ部 実装 • 5章 マイクロ サービスの 通信の実装 • 6章 ワークフロー • 7章 ビルド • 8章 デプロイ • 9章 テスト • 10章 監視から 可観測性へ • 11章 セキュリ ティ • 12章 レジリエン ス • 13章 スケーリン グ • 第Ⅲ部 人 • 14章 UI • 15章 組織構造 • 16章 進化的 アーキテクト 第1版 • 1章 マイクロサービス • 2章 進化的アーキ テクト • 3章 サービスの モデル化方法 • 4章 統合 • 5章 モノリス(一枚 岩)の分割 • 6章 デプロイ • 7章 テスト • 8章 監視 • 9章 セキュリティ • 10章 コンウェイの 法則とシステム設計 • 11章 大規模な マイクロサービス • 12章 まとめ
  3. 1章 マイクロサービスとは (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 パブリッククラウドとサーバレス
  4. 1章 マイクロサービスとは (2) • 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 まとめ
  5. 1章 マイクロサービスとは • マイクロサービスは、ビジネスドメインを中心に モデル化された、独立してリリース可能なサービス • サービスは機能をカプセル化し、ネットワーク経由で 他のサービスからアクセス可能 • 例:

    在庫、注文管理、発送を表すマイクロサービス が、ECシステムを構成 • マイクロサービスの重要な概念 1. 独立デプロイ可能性 2. ビジネスドメインに基づくモデル化 3. マイクロサービスごとの状態の所有 4. サイズ 5. 柔軟性 6. アーキテクチャと組織の連携 – ストリームアラインドチーム
  6. 1章 マイクロサービスとは • モノリスでは、システムのすべての機能を まとめてデプロイしなければならない • デリバリ競合が起きやすい 1. 単一プロセスモノリス 2.

    モジュラーモノリス 3. 分散モノリス • 実現技術 1. ログ集約と分散トレーシング – Honeycombなど 2. コンテナとKubernetes 3. ストリーミング - Kafkaなど 4. パブリッククラウドとサーバレス
  7. 1章 マイクロサービスとは • マイクロサービスの利点 1. 技術の異種性 2. 堅牢性 – バルクヘッド

    3. スケーリング 4. デプロイの容易性 5. 組織との連携 6. 合成可能性 • マイクロサービスの課題 1. 開発者体験 2. 技術の過負荷 3. コスト 4. レポート 5. 監視とトラブルシューティング 6. セキュリティ 7. テスト 8. 遅延 9. データ一貫性
  8. 1章 マイクロサービスとは • マイクロサービスを使うべきか • 役立たない場合 1. 新製品、スタートアップ 2. 顧客がデプロイ、管理する

    ソフトウェアを開発している組織 • 効果的な場所 1. 急成長している100人規模の企業 2. SaaSアプリケーション 3. さまざまな新規チャネルで顧客に サービスを提供することを目指す組織
  9. 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 まとめ
  10. 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 まとめ
  11. 4章 マイクロサービスの通信スタイル (1) 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 非同期非ブロッ キングの用途
  12. 4章 マイクロサービスの通信スタイル (2) 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 まとめ
  13. 5章 マイクロサービスの通信の実装 (1) 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 偶発的な破壊的変更の 早期把握
  14. 5章 マイクロサービスの通信の実装 (2) 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 まとめ
  15. 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 まとめ
  16. 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 まとめ
  17. 8章 デプロイ (1) 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 どのデプロイオプションが 自分に適しているか
  18. 8章 デプロイ (2) 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 まとめ
  19. 9章 テスト (1) 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 独立テスト容易性の欠如
  20. 9章 テスト (2) 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 まとめ
  21. 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 まとめ
  22. 11章 セキュリティ (1) 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 再構築
  23. 11章 セキュリティ (2) 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 まとめ
  24. 12章 レジリエンス (1) 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 冪等性
  25. 12章 レジリエンス (2) 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 まとめ
  26. 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 まとめ
  27. 14章 UI (1) 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 ウィジェットベースの分解を 使う場合
  28. 14章 UI (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 まとめ
  29. 15章 組織構造 (1) 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 プラットフォーム
  30. 15章 組織構造 (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 まとめ
  31. 16章 進化的アーキテクト (1) 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 進化的アーキテクチャへの 指針
  32. 16章 進化的アーキテクト (2) 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 まとめ
  33. 関連リソース • O'Reilly Japan - マイクロサービスアーキテクチャ 第2版 • O'Reilly Japan

    - マイクロフロントエンド • O'Reilly Japan - モノリスからマイクロサービスへ • O'Reilly Japan - プロダクションレディマイクロサービス • O'Reilly Japan - 進化的アーキテクチャ • O‘Reilly Japan - Learning Platform (サブスクリプション)
  34. 関連リソース • マイクロサービス アーキテクチャの設計 - Azure Architecture Center • マイクロサービスの設計パターン

    - Azure Architecture Center • AKS のマイクロサービス アーキテクチャ - Azure Architecture Center • 高度な Azure Kubernetes Service (AKS) マイクロサービス アーキテクチャ – Azure Architecture Center • Azure Container Apps を使用したマ イクロサービスのデプロイ - Azure Architecture Center • Azure Container Apps と Dapr を 使ってマイクロサービスをデプロイする - Azure Example Scenarios • .NET Microservices アプリケーション アーキテクチャ ガイダンス • .NET と ASP.NET Core を使用してマ イクロサービスを作成する - Training