ntsk

「分散システムデザインパターン」を読んだ

February 25, 2022

O’Reilly 「分散システムデザインパターン-コンテナを使ったスケーラブルなサービス設計」を読んだ。

分散システムデザインパターン

書籍について

コンテナを使った分散システムのデザインパターンがまとまっている。 デザインパターンというと自分はGoFのデザインパターンをイメージするが、まさにそのような形でコンテナを利用した設計パターンが用途別に列挙されている。

机上の理想論のような内容ではなく、Docker, Kubernetes, Nginx, Redis, Memcached, Fluentd, Vernish, Kafka, Prometheus etc…といった最近のWebアプリケーション開発で多く採用されているソフトウェア・ミドルウェアを例として利用している他、ハンズオンも用意されており実務に即した内容になっている。

モチベーション

現職では自身はアプリケーション開発が主で、コンテナオーケストレーションを利用した既存の分散システムを触る機会は多々あるものの、自身が1から分散システムの設計を行うという機会はあまりない。

いざ自身が設計構築を行う必要がある時、これまで触ったことのある設計や、事例として世の中に存在する設計以外を選択肢として持つことができないだろうと思う。 また、誰かが設計を提案した時、選択肢を多く知っていないことには、良し悪しについての議論も難しい。

これらの課題は単純に設計のボキャブラリが少ないことが原因であるため、インスタントにそれらを埋めてくれることを期待して読んで見ることにした。

構成

具体的な書籍の内容については記載を避けるが、大きく3部構成となっており以下のようなパターンが紹介されている。

(目次より引用)

  • シングルノードパターン
    • サイドカー
    • アンバサダ
    • アダプタ
  • マルチノードパターン
    • レプリカがロードバランスされたサービス
    • シャーディングされたサービス
    • スキャッタ・ギャザー
    • ファンクションとイベント駆動処理
    • オーナーシップの選出
  • バッチ処理パターン
    • ワークキューシステム
    • イベント駆動バッチ処理
    • 協調的バッチ処理

シングルノードパターンの部では、1台のマシンで動く場合のコンテナの分割について紹介されている。サイドカー、アンバサダ、アダプタのパターンの紹介とともに関心の分離以外にもリソースの分離やスケールの容易性の観点から、1台のノードで動かす場合でもコンテナを分離して動かす利点について語られている。

マルチノードパターンの部では、所謂マイクロサービスを初めとしたマルチノードの分散パターンについて紹介されている。 ステートレス、ステートフルなサービスの負荷分散手法の他、処理の高速化を目的とした分散や、FaaSとどのように組み合わせていくかであったり、分散オーナーシップによるスケーラブルな役割管理について説明されている。

最後に、バッチ処理パターンの部では、短時間で動作するバッチ処理における分散パターンについて紹介されている。並列処理によって巨大なデータを高速に処理するという観点以外にも、再利用可能性やスケーラビリティ、完全性などの観点からいくつかのパターンの解説が行われている。

感想

Webアプリケーション開発において、どんなサービスかに関わらずだいたいこうゆうことやりたいよねということが基本からまとまっており、順序立てて最小の構成から説明してもらえるため、読む前は堅めの書籍のイメージだったが、インフラに普段あまり関わらない自分でも理解しやすかった。

概要にも記載したが、Webアプリケーション開発で多く採用されているソフトウェアを利用したハンズオンが用意されている点が自分としてはとても良かったポイントで、自身が関わっているサービスと比較しつつ、そうだよねと同意できる点や、なるほどと考えさせられる点があり既存の知識を補完してくれた。

より具体的に記載されている分、パラダイムが大きく変わると理想的なパターンが記載されている内容から変わっていく可能性はあると思う。一方で、分散システムを構築する上での考え方については長く活用できるだろうし、とにかく今日の開発で役立つ知識がきれいに言語化されてまとまっていると感じたので、コンテナを使っている開発者はとりあえず読んでみると良いと思う。


© 2020-2022 ntsk.