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

June 7, 2019

はじめに

「分散システムデザインパターン」(O’Reilly Japan)を読みましたので、読了後少し時間があいてしまいましたがつらつら書いてまいります。

O’Reilly Japan - 分散システムデザインパターン

どんな本か

 分散システムは一般的に複雑で難しいイメージがある、というか実際にそうで、特にアプリケーション開発者にはインフラくさいことをだいぶ意識しないといけないこともあり苦手意識が強い方も多いかなと思います。しかし先人たちの努力のおかげでこういう時はこうするといったパターン化が進み、ものによっては便利なツールを使う、またはマネージドサービスを使って金で解決する等で、複雑な仕組みを自分たちで構築せずとも使うことができるようになってきています。

 この本はそんないくつかのパターンを活用して、分散システムを効率よく実現できるよう手助けしてくれる内容になっています。最初にパターンの説明をしてから、これはこういうケースに適しているよとハンズオンで紹介してくれるのが主な流れ。ざっと説明を読んでおいて、何かしたいことが出てきた時にそういえばあの本にこんなこと書いてあったなと思い出してハンズオンを参考にすると良さそうです。もちろん素振り的にハンズオンを通してやるもよし。
 コンテナおよびKubernetesが強く意識されていますが、そうでない環境を扱う場合にも考え方や知識として有用な内容だと思います。

著者について

 著者のBrendan Burns氏はKubernetesプロジェクト立ち上げメンバーの1人で、元GoogleのGoogle Cloud Platform チーム所属、現在はマイクロソフトのAzureチーム所属ということです。MSにこういう方がいるというのが時代が変わった感ある(いたのかもしれないけど少なくとも外向けの顔はそういう会社ではなかったですよね)。
 Googleはだいぶ前からあらゆるサービスをコンテナで実行していると公言しているし、パブリッククラウド基盤はおそらく現代の分散システム最前線と言えるはずです。この分野では第一人者と言ってよく、本書の内容はそのキャリアを裏付けに信頼を置けるものと考えて差し支えないでしょう。

構成

この本では分散システムを大きく以下の3つに分類して紹介しています。

### シングルノードパターン
* 1 台のノードで複数のコンテナが協調して動くサーバアプリケーション
* 実現したいこと
	* コンピュータリソース/オーナーシップ/関心の分離
	* 再利用可能
* サイドカー / アンバサダ / アダプタ

### マルチノードパターン
* 複数のノードにまたがって配置したコンテナが協調して動くサーバアプリケーション
* 実現したいこと
	* 信頼性(耐障害性)
	* スケーラビリティ
* ロードバランス / シャーディング / スキャッタ・ギャザー / FaaS / オーナーシップの選出

### バッチ処理パターン
* 複数コンテナで動作するバッチアプリケーション
* 実現したいこと
	* 非同期処理を効率よく実行する
* ワークキューシステム / イベント駆動バッチ処理 / 協調的バッチ処理

 最近のシステムだと上記3パターンと何かしら似たような構成が取られることが多いかと思うので、関わっているシステムに思いをはせながら、ここはこうしたほうがいいのかもとか、これ取り入れてみようなどと考えながら読み進めると楽しいかもしれません。
 チームで輪読するのも良さそうです。コンテナを使っていない環境で、もしコンテナを導入するならどうする?をこの本読みながら議論するのも酒が進みそうであります。

共通認識を持つことの重要性

一部本文から引用しますと、

パターンは、相互理解をすばやく深めるための共通のボキャブラリになります。
このような相互理解によって、知識の共有やさらに深い学びが得られます。
この点をさらに理解するため、私たちは家を作るのに同じ部品を使っていると考えましょう。
私はその部品を「Foo」と呼び、あなたはそれを「Bar」と呼んでいます。
Foo と Bar の価値を議論したり、Foo と Bar の異なる特性を説明したりした結果、
実は同じ部品について話していることに気づくまでに、いったいどれくらいの時間が必要でしょうか。
Foo と Bar が同じものであると分からないと、お互いの経験から学ぶことはできません。

『分散システムデザインパターン』1.3.2 1つのやり方を議論するための共通言語

 まさにこういうことってよくあるわけで、関係者が共通のボキャブラリをもって本質的な議論に集中できる状態であることは円滑にプロジェクトを進める上で重要です。何事も基礎を勉強することの価値はこういうところにあるはずだし、本書のように権威ある人が書いた本が出版されるのも、ある種のリファレンスになるという意味で少なからずその分野の発展に寄与することになるのではないかと思います。

終わりに

 全体的に現在分散システムについて知っておくべき知識がコンパクトにまとまった良書だと感じました。掘り下げれば先述の3パターンそれぞれで1冊本が書けそうな気もしますが、そういう本はけっこう腰据えて読まないといけないから疲れるし、ざっと読んで分散システムの今を俯瞰するのにはこのくらいの分量がちょうどいいかなと思います。
 次は分散システムそのものに付随する運用まわり、デバッグどうしようとかデプロイがつらいよみたいな悩みにフォーカスした続編が出たら嬉しいな。

 それでは雑に以上です。

関連リンク

@j_untanaka on Twitter