イベント駆動マイクロサービス 第2版

組織全体でデータを活用するための設計と実践

5,720円

内容

イベント駆動マイクロサービスは、イベントストリームを活用し、組織全体で発生するデータや状態の変化にリアルタイムで対応するための最適なアプローチです。本書は、イベント駆動アーキテクチャの基本原則から、高度なマイクロサービスアプリケーションの実装までを包括的に解説する実践的なガイドです。第2版では、スキーマやイベント設計、結果整合性といった重要な概念を深く掘り下げるとともに、クラウドネイティブ環境やストリーミングSQLといった最新の技術動向にも対応しています。データのモデリングから、再利用可能な設計パターン、既存アーキテクチャへの統合手法までを学ぶことで、スケーラビリティと耐障害性に優れた疎結合なシステムを構築できるようになります。すべてのシステムを一度に移行するのではなく、ビジネスの成長に合わせて段階的に価値を生み出し、組織のデータを大規模に活用するための確かな指針を提供します。

関連書籍

目次

序文
まえがき

第I部 イベント駆動マイクロサービス入門

1章 イベント駆動マイクロサービスを選ぶ理由
    1.1 イベント駆動マイクロサービスとは何か? 
    1.2 ドメイン駆動設計と境界づけられたコンテキスト入門
    1.3 マイクロサービス、境界、コミュニケーション構造
        1.3.1 ビジネスコミュニケーション構造
        1.3.2 実装コミュニケーション構造
        1.3.3 データコミュニケーション構造
        1.3.4 Conway の法則とコミュニケーション構造
    1.4 従来のコンピューティングにおけるコミュニケーション構造
        1.4.1 選択肢1:新しいサービスを作る
        1.4.2 選択肢2:既存のサービスに追加する
        1.4.3 各選択肢の利点と欠点
        1.4.4 チームの選択、その後
    1.5 イベント駆動データコミュニケーション
    1.6 イベント駆動マイクロサービスを利用するチーム
    1.7 リクエスト/レスポンスマイクロサービス
        1.7.1 リクエスト/レスポンスマイクロサービスの欠点
        1.7.2 リクエスト/レスポンスマイクロサービスの利点
    1.8 まとめ

2章 イベントとイベントストリームの基礎
    2.1 イベントとは何か? 
    2.2 イベントストリームとは何か? 
        2.2.1 エフェメラルメッセージング
        2.2.2 キューイング
        2.2.3 現在のキューブローカーが提供するキュー
        2.2.4 Apache Kafka によるキュー
    2.3 イベントの構造
        2.3.1 キーなしイベント
        2.3.2 キー付きイベント
        2.3.3 エンティティイベント
    2.4 イベントストリームの再パーティショニング
    2.5 イベントストリームのコパーティショニング
    2.6 キー付きイベントからのステート集約
    2.7 エンティティイベントからのステートのマテリアライズ
    2.8 イベントの削除とイベントストリームのコンパクション
    2.9 カッパアーキテクチャ
    2.10 ラムダアーキテクチャ
    2.11 イベントデータ定義とスキーマ
    2.12 イベントブローカーでマイクロサービスを動かす
    2.13 イベントブローカーの選定
        2.13.1 支援ツール
        2.13.2 ホスティングサービス
        2.13.3 クライアントライブラリと処理フレームワーク
        2.13.4 コミュニティサポート
        2.13.5 無期限ストレージと階層型ストレージ
    2.14 まとめ

3章 イベント駆動マイクロサービスの基礎
    3.1 イベント駆動マイクロサービスの基本
    3.2 基本的なプロデューサー/コンシューマー型
    3.3 ストリーム処理型イベント駆動マイクロサービス
    3.4 ストリーミングSQLクエリ
    3.5 レガシーアプリケーション
    3.6 トポロジーとイベント駆動マイクロサービス
        3.6.1 マイクロサービストポロジー
        3.6.2 ビジネストポロジー
    3.7 イベント駆動マイクロサービスの責務
    3.8 マイクロサービスはどこまで小さくすべきか? 
    3.9 大規模環境でのマイクロサービス管理
        3.9.1 マイクロサービスをコンテナ上で実行する
        3.9.2 マイクロサービスを仮想マシンで実行する
        3.9.3 コンテナと仮想マシンの管理
    3.10 マイクロサービス税を払う
    3.11 サービスコントラクト
    3.12 まとめ

第II部 イベントとイベントストリーム

4章 スキーマとデータコントラクト
    4.1 シリアライゼーションとデシリアライゼーションの概要
    4.2 スキーマとは何か? 
    4.3 どのスキーマ技術を選ぶべきか
        4.3.1 Google のProtocol Buffers(Protobuf)
        4.3.2 Apache Avro
        4.3.3 JSON Schema
    4.4 スキーマ進化:時間の経過に伴うスキーマの変更
    4.5 データコントラクトとは何か? 
    4.6 破壊的なスキーマ変更の合意形成
        4.6.1 ステップ1:新しいスキーマを設計する
        4.6.2 ステップ2:既存のコンシューマーの担当者に相談して承認を得る
        4.6.3 ステップ3:リリース、移行、非推奨化を計画する
        4.6.4 ステップ4:リリースを実行する
    4.7 スキーマレジストリの役割
    4.8 フィールドレベル暗号化
    4.9 データカタログとの統合
    4.10 まとめ

5章 イベントの設計
    5.1 イベント型の概要
    5.2 ステートイベントとイベント搬送型ステート転送
        5.2.1 現在のステートイベント
        5.2.2 変更前後のステートイベント
    5.3 デルタイベント
        5.3.1 イベントソーシングのためのデルタイベント
        5.3.2 デルタイベントの問題点
        5.3.3 デルタイベントとステートイベントはどこで使うべきか? 
    5.4 ハイブリッドイベント:デルタを少し含むステート
    5.5 計測イベント
        5.5.1 計測イベントは集計を可能にする
        5.5.2 計測イベントのソースではロスが発生することがある
        5.5.3 計測イベントは時間要件のあるアプリケーションを支えられる
    5.6 通知イベント
    5.7 データプライバシーと忘れられる権利のためのイベント設計
    5.8 まとめ

6章 イベント駆動アーキテクチャと既存システムの統合
    6.1 データ解放とは何か? 
    6.2 二重書き込みアンチパターン
    6.3 データ解放パターン
    6.4 データ解放フレームワーク
    6.5 変更データキャプチャを使ったデータ解放
        6.5.1 初期データセット状態のスナップショット
        6.5.2 データストアログを使った変更データキャプチャの利点
        6.5.3 データストアログを使った変更データキャプチャの欠点
    6.6 定期クエリによるデータ解放
        6.6.1 増分更新
        6.6.2 クエリベース更新の利点
        6.6.3 クエリベース更新の欠点
    6.7 トランザクショナルアウトボックステーブルを使ったデータ解放
        6.7.1 パフォーマンスの考慮事項
        6.7.2 内部データモデルの分離
        6.7.3 スキーマ互換性の確保
        6.7.4 トリガーを使った変更データのキャプチャ
    6.8 キャプチャ対象のデータセットに対するデータ定義の変更
    6.9 データ解放における妥協点
    6.10 イベントデータのデータストアへのシンク
    6.11 シンクとソーシングがビジネスに与える影響
    6.12 まとめ

7章 非正規化とイベント化
    7.1 トランザクショナルアウトボックスでのイベント化
    7.2 専用サービスでのイベント化
    7.3 イベントに含めるべきものは何か? 含めるべきでないものは何か? 
    7.4 緩やかに変化するディメンション
        7.4.1 Type 1:新しい値で上書き
        7.4.2 Type 2:新しい値を追記
    7.5 まとめ

8章 ステートフルなイベント駆動マイクロサービス
    8.1 イベントストリームパーティションとコンシューマー割り当て
        8.1.1 イベントストリームの再パーティショニング
        8.1.2 イベントストリームのコパーティショニング
        8.1.3 コンシューマーグループ内でのパーティション割り当て
    8.2 マイクロサービスに適したステートストアの選択
    8.3 内部ステートストアへのステートのマテリアライズ
        8.3.1 ステート復元にチェンジログイベントストリームを使う
        8.3.2 グローバルステートのマテリアライズ
        8.3.3 内部ステートストアの利点
        8.3.4 内部ステートストアの欠点
        8.3.5 内部ステートのスケーリングと復元
    8.4 外部ステートストアへのステートのマテリアライズ
        8.4.1 外部ステートの利点
        8.4.2 外部ステートの欠点
        8.4.3 外部ステートストアを使ったスケーリングと復旧
    8.5 外部ステートストアの再構築
    8.6 トランザクションとeffectively once 処理
        8.6.1 例:在庫集計サービスにおけるeffectively once 処理
        8.6.2 クライアント/ブローカートランザクションによるeffectively once 処理
        8.6.3 クライアント/ブローカートランザクションを使用しないeffectively once 処理
    8.7 まとめ

9章 決定論的なストリーム処理
    9.1 イベント駆動ワークフローにおける決定論性
    9.2 タイムスタンプ
    9.3 分散システムにおけるタイムスタンプの同期
    9.4 イベントスケジューリングと決定論的な処理
        9.4.1 カスタムイベントスケジューラー
        9.4.2 イベント時間、処理時間、取り込み時間に基づく処理
        9.4.3 コンシューマーによるタイムスタンプの抽出
        9.4.4 外部システムへのリクエスト/レスポンス型の呼び出し
    9.5 ウォーターマーク
    9.6 並列処理におけるウォーターマーク
    9.7 ストリーム時間
    9.8 イベント順序の乱れと遅延到着
        9.8.1 ウォーターマークとストリーム時間における遅延イベント
        9.8.2 イベント順序が乱れる原因と影響
        9.8.3 時間に依存する処理とウィンドウ処理
    9.9 遅延イベントの処理
    9.10 ニアリアルタイムでの処理と再処理の比較
    9.11 断続的な障害と遅延イベント
        9.11.1 プロデューサー/イベントブローカー間の接続問題
    9.12 まとめとさらなる読み物

10章 マイクロサービスによるワークフローの構築
    10.1 コレオグラフィー型
        10.1.1 コレオグラフィーワークフローの変更
        10.1.2 コレオグラフィーワークフローの監視
    10.2 オーケストレーション型
        10.2.1 イベント駆動オーケストレーションの簡単な例
        10.2.2 リクエスト/レスポンスによるオーケストレーションの簡単な例
        10.2.3 オーケストレーションワークフローの変更
        10.2.4 オーケストレーションワークフローの監視
        10.2.5 リクエスト/レスポンス型オーケストレーションとイベント駆動型オーケストレーションの比較
    10.3 分散トランザクションとSaga パターン
        10.3.1 コレオグラフィー型によるSaga 
        10.3.2 オーケストレーション型Saga 
    10.4 補正ワークフローパターン
    10.5 永続実行エンジンによるオーケストレーションの実装
        10.5.1 永続性を持つ追記専用ログによるイベントソーシング
        10.5.2 永続実行に関するその他の考慮事項
    10.6 まとめ

第III部 イベント駆動マイクロサービスフレームワーク

11章 基本的なプロデューサー/コンシューマーマイクロサービス
    11.1 BPCが適するユースケース
        11.1.1 サイドカーパターンでの既存システムとの統合
        11.1.2 イベント順序に依存しないステートフルなビジネスロジック
        11.1.3 データストアが処理の大半を担う場合
        11.1.4 処理とデータストアの独立したスケーリング
    11.2 まとめ

12章 ヘビーウェイトフレームワークによるマイクロサービス
    12.1 ヘビーウェイトフレームワークの歴史
    12.2 例:クリックと広告表示のセッションウィンドウ処理
    12.3 ヘビーウェイトフレームワークの仕組み
    12.4 利点と制限事項
    12.5 クラスターの構築方法と実行モード
        12.5.1 マネージドサービスの利用
        12.5.2 独自クラスターの構築と運用
    12.6 アプリケーションの投入方式
        12.6.1 ドライバー方式
        12.6.2 クラスター方式
    12.7 ステートの管理とチェックポイント
    12.8 アプリケーションのスケーリングとパーティション処理
        12.8.1 再起動によるアプリケーションのスケーリング
        12.8.2 実行中のアプリケーションのスケーリング
        12.8.3 アプリケーションの自動スケーリング
    12.9 障害からの復旧
    12.10 マルチテナンシーの考慮事項
    12.11 言語と構文
    12.12 フレームワークの選択
    12.13 まとめ

13章 ライトウェイトフレームワークによるマイクロサービス
    13.1 例:外部キーによるプロダクトデータとブランドデータの結合
    13.2 ライトウェイトフレームワークの仕組み
        13.2.1 イベントシャッフルと再パーティショニング
        13.2.2 ステートの処理とチェンジログの利用
        13.2.3 スケーリングと障害からの復旧
        13.2.4 ステートの割り当て
        13.2.5 ステートのレプリケーションとホットレプリカ
    13.3 まとめ

14章 ストリーミングSQL
    14.1 継続クエリの基本
    14.2 ストリーミングSQLクエリのためのストリームのテーブル宣言
    14.3 例:Flink SQLによるデータエンリッチメント
    14.4 ストリーミングSQLコードの実行
        14.4.1 SQLコードをコマンドラインインターフェースから実行する
        14.4.2 SQLコードをアプリケーション内から実行する
        14.4.3 SQLコードをノートブックから実行する
        14.4.4 SQLコードをゲートウェイ経由で実行する
        14.4.5 サイドカーとしてのSQL 
    14.5 ユーザー定義関数の呼び出し
    14.6 まとめ

15章 Function-as-a-Serviceを使ったマイクロサービス
    15.1 Function-as-a-Service を使う理由
    15.2 関数を使ったマイクロサービスの構築
    15.3 コールドスタートとウォームスタート
    15.4 終了とシャットダウン
    15.5 FaaS プロバイダーの選択
    15.6 トリガーによる関数の起動
        15.6.1 新しいイベントに基づくトリガー:イベントストリームリスナー
        15.6.2 コンシューマーグループラグに基づくトリガー
        15.6.3 スケジュールに基づくトリガー
        15.6.4 Webhook を使ったトリガー
        15.6.5 リソースイベントに基づくトリガー
    15.7 FaaS ソリューションのスケーリング
    15.8 ステートの維持
    15.9 関数によるほかの関数の呼び出し
        15.9.1 非同期イベント駆動コミュニケーションパターン
        15.9.2 関数を直接呼び出すパターン
    15.10 FaaS 関数の障害処理
    15.11 永続関数オーケストレーション
        15.11.1 独自仕様の定義ファイルでワークフローを定義する
        15.11.2 ソースコードでワークフローを定義する
    15.12 まとめ

第IV部 整合性、不正データ、支援ツール

16章 結果整合性
    16.1 整合性への収束は1 つのイベントずつ進む
    16.2 結果整合性への対処戦略
        16.2.1 ステートイベント型を使う
        16.2.2 サーバーレスポンス内で結果整合性を明示する
        16.2.3 リクエスト/レスポンスの代わりにイベント駆動コミュニケーションを使う
        16.2.4 障害を減らして不整合を防ぐ
    16.3 まとめ

17章 イベント駆動マイクロサービスとリクエスト/レスポンスマイクロサービスの統合
    17.1 リクエストのイベント変換
    17.2 RESTプロキシを使ったリクエストのイベント変換
    17.3 サードパーティのリクエスト/レスポンスAPI との統合
    17.4 リクエスト/レスポンスAPI を使ったデータ提供
        17.4.1 内部ステートストアを使ったリクエスト処理
        17.4.2 外部ステートストアを使ったリクエスト処理
    17.5 イベント駆動ワークフロー内でのリクエスト処理
    17.6 ユーザーインターフェースのためのイベント処理
        17.6.1 例:新聞発行ワークフロー(承認パターン) 
        17.6.2 例:編集者承認サービスと広告主承認サービスの分離
    17.7 リクエスト/レスポンスアプリケーションのマイクロフロントエンド
        17.7.1 例:体験検索・レビューアプリケーション
        17.7.2 マイクロフロントエンドの利点
        17.7.3 マイクロフロントエンドの欠点
    17.8 まとめ

18章 イベントストリームの不正データ処理
    18.1 イベントストリームの主な不正データの種類
        18.1.1 タイプ1:破損データ
        18.1.2 タイプ2:スキーマのないイベント
        18.1.3 タイプ3:無効なスキーマを持つイベント
        18.1.4 タイプ4:互換性のないスキーマ進化
        18.1.5 タイプ5:フィールド内の論理的に無効な値
        18.1.6 タイプ6:論理的には有効だが意味的に誤った値
        18.1.7 タイプ7:欠落イベント
        18.1.8 タイプ8:生成されるべきでなかったイベント
    18.2 スキーマ、バリデーション、テストによる不正データの防止
        18.2.1 タイプ1~5 の不正データを防ぐスキーマとスキーマ進化
        18.2.2 データ品質ルール:タイプ6(論理的には有効だが意味的に誤った値)への対処
        18.2.3 テスト:タイプ7(欠落データ)とタイプ8(生成されるべきでなかったデータ)への対処
    18.3 不正データの修正におけるイベント設計の役割
    18.4 ステートイベントによる修正と伝播
    18.5 前進型の修正:新しいデルタで不正デルタを取り消す
    18.6 最後の手段:巻き戻し、再構築、リトライ
        18.6.1 外部ソースからの巻き戻し、再構築、リトライ
        18.6.2 トピックをソースとした巻き戻し、再構築、リトライ
    18.7 まとめ

19章 支援ツール
    19.1 インフラの選択:自前での構築とクラウドサービスの利用
    19.2 クラスターとサービスのためのInfrastructure as Code 
    19.3 アイデンティティとアクセス管理
    19.4 マイクロサービスとチームの対応管理システム
    19.5 イベントストリームの作成と変更
    19.6 イベントストリームとマイクロサービスのメタデータタグ付け
    19.7 クォータ
    19.8 スキーマレジストリ
    19.9 イベントストリームの権限管理
    19.10 スキーマ作成、変更の通知
    19.11 コンシューマーオフセット管理
    19.12 ステート管理とアプリケーションリセット
    19.13 コンシューマーオフセットラグ監視
    19.14 マイクロサービス作成プロセスの効率化
    19.15 コンテナ管理機能
    19.16 マルチクラスターデプロイメントとイベントストリームレプリケーション
    19.17 依存関係の追跡とトポロジーの可視化
    19.18 まとめ

20章 イベント駆動マイクロサービスのテスト
    20.1 一般的なテストの原則
    20.2 マイクロサービス関数のユニットテスト
        20.2.1 ステートレス関数のユニットテスト
        20.2.2 ステートフル関数のユニットテスト
    20.3 完全なイベント駆動トポロジーのテスト
    20.4 スキーマ進化と互換性のテスト
    20.5 イベント駆動マイクロサービスの統合テスト
    20.6 ローカル統合テスト
        20.6.1 テストコードのランタイム内にテスト環境を作成する
        20.6.2 コンテナを使ったテスト環境の作成
        20.6.3 ホスト型、管理型、SaaS サービスの統合
    20.7 完全なリモートクラウドサービスを使ったテスト
        20.7.1 プログラムで一時的な単一テナントテスト環境を作成する
        20.7.2 永続マルチテナント環境を使ったテスト
        20.7.3 本番環境を使ったテスト
    20.8 完全リモート統合テスト戦略の選択
    20.9 まとめ

21章 イベント駆動マイクロサービスのデプロイ
    21.1 マイクロサービスデプロイの原則
    21.2 マイクロサービスデプロイのアーキテクチャコンポーネント
        21.2.1 継続的インテグレーション、デリバリー、デプロイシステム
        21.2.2 コンテナ管理システムとコモディティハードウェア
    21.3 基本フルストップデプロイパターン
    21.4 ローリングアップデートパターン
    21.5 破壊的スキーマ変更パターン
        21.5.1 派生形1:破壊的イベントを既存ストリームに書き込む
        21.5.2 派生形2:破壊的イベントを新しいストリームに書き込む
        21.5.3 派生形3:古いイベントと新しいイベントを並行して書き込む
        21.5.4 破壊的スキーマ変更のための履歴データの再処理
    21.6 ブルーグリーンデプロイパターン
    21.7 まとめ

22章 本書のまとめ
    22.1 データコミュニケーション構造
    22.2 ビジネスドメインと境界づけられたコンテキスト
    22.3 ツール、インフラ、マイクロサービス税
    22.4 イベント設計
    22.5 スキーマ化されたイベント
    22.6 データ解放と信頼できる唯一の情報源
    22.7 マイクロサービス
    22.8 マイクロサービス実装オプション
    22.9 テスト
    22.10 デプロイ
    22.11 最後に

索引