【技術本】分散システムデザインパターン
https://amzn.to/3UeWvqX
【技術本】分散システムデザインパターン
へポスト
シンプルなシングルノードから、マルチノード(リアルタイム処理、バッチ処理)のパターンまで順を追って最適なデザインパターンを紹介してくれている。どれも、シンプルな構造まで落とし込んだもので纏められている。
Dockerを利用してミドルウェアを水平分散クラスタ構成などにして簡易的な環境をつくるまでコマンド、コードで示している。
マルチノードのリアルタイム処理システムにおいては、システムのどの部分をマイクロサービスとしての部品に分割し、それらをスケール可能な構成にするため、どの技術を採用すべきか等の俯瞰的な思考を学ぶことができる。
近年のコンシューマ向け大規模Web開発に携わっていればお馴染みのパターンが多く、前提知識として必須の内容を網羅している、逆に言えば真新しい解釈のものはなかったのが少し残念。
具体的なコードレベルでスケール可能な分散システム開発を知りたければ、一例のみの記載になるが、同オライリーより出版されている「スケーラブルリアルタイムデータ分析入門:ラムダアーキテクチャによるビッグデータ処理」もおすすめ。
以下、内容メモ。
--------------------------
シングルノードパターン
・サイドカー
一台のマシンで動く2つのコンテナから構成
アプリケーションコンテナ:コアロジック含む
サイドカーコンテナ:拡張改善用
例:レガシーなHTTPウェブサービスをHTTPSに対応させる
レガシーWebをローカルホスト接続のみに対応させ、HTTPSに対応したnginxをサイドカーコンテナとして配置。ローカルホストで動くサービスに接続できるようにする。すると、nginxが外部からのHTTPSトラフィックを終端できる。
nginx=SSLプロキシ→レガシーHTTPSサーバ
・アンバサダ
色々なアプリケーションコンテナと組み合わせ可能。
シャーディングアンバサダプロキシ:アプリを複数のサーバにデプロイするための仕組み
twemproxy(redis, memcache 向けプロキシ)を使ったdocker環境での実践。
アプリケーションコンテナと、サービスブローカアンバサダのロジックを分離できる。
・アダプタ
外部利用者→外部インタフェース→アダプタコンテナ→アプリケーションコンテナ
Prometheusを使ったコンテナの監視例、redisのスロークエリを監視できるようにする。
アダプタでログをイベントの標準セットに正規化する。
--------------------------
マルチノードパターン
・マイクロサービス;マルチノードの分散ソフトウェアアーキテクチャ。別々のプロセスとして動作し、定義済みのAPIを通じて通信する多くのコンポーネントからなる。
モノリシックの対極がマイクロサービス
・レプリカがロードバランスされたサービス
各サーバは全く同じ構成、処理。
接続先のサーバを固定する方法:IPアドレスなどをコンシステントハッシュ関数をとって接続先を決定する。
Varnishのキャッシュサーバ、SSL終端にしたい場合は、nginxを追加する。
ステートレスなサービス向け。
・シャーディングされたサービス
シャーディングされたサーバごとに扱えるリクエスト、データが異なる。
ステートフルなサービス向け。
保存すべき状態データが大きくなった時にスケールする。
・スキャッタ・ギャザー
処理時間をスケールさせる:リクエスト処理の並列化(上述までは、リクエスト数をスケールする方法であった)
リクエストを受け持つリーフ構造で各リーフは処理の一部を行いルートに返す。
シャーディング配置されたデータの検索など。
レスポンスが一番遅いノードに性能が引きずられる問題がある。
・ファンクションイベントとイベント駆動処理
負荷が大きく、巨大なデータをメモリに保持していたり、なんらかのバックグラウンド処理を行うアプリに適している。
・オーナシップの選出
役割の割り当てをスケールさせる方法。
--------------------------
バッチ処理パターン
・MapReduceパターン
・ワークキューシステム
・イベント駆動バッチ処理
バッチの分割、連結、統合
・協調的バッチ処理
以上。
へポスト
