4月に出版された「分散システムデザインパターン」を読んだ.サブタイトルに「コンテナを使ったスケーラブルなサービスの設計」とある通り,コンテナを設計/運用するときに,どのようなデザインパターンを知っておくと良いのか?という点を学べる内容になっている.関連情報と合わせて書評を書きたいと思う.なお,今回は貴重な機会を頂き,本書の出版レビューに参加することができた.オライリー本に自分の名前が載っている!という喜びもある.
分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計
- 作者: Brendan Burns,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2019/04/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
目次
- 1章 : はじめに
- 第 I 部 : シングルノードパターン
- 2章 : サイドカー
- 3章 : アンバサダ
- 4章 : アダプタ
- 第 II 部 : マルチノードパターン
- 5章 : レプリカがロードバランスされたサービス
- 6章 : シャーディングされたサービス
- 7章 : スキャッタ・ギャザー
- 8章 : ファンクションとイベント駆動処理
- 9章 : オーナーシップの選出
- 第 III 部 : バッチ処理パターン
- 10章 : ワークキューシステム
- 11章 : イベント駆動バッチ処理
- 12章 : 協調的バッチ処理
- 13章 : まとめ:新しい始まり?
サイドカー
「シングルノードパターン」の中で紹介されている「サイドカー」は,Fluentd を使ったログ収集など,非常によく知られたパターンだと思う.本書では,まずレガシーアプリケーションをテーマにし,HTTPS 化をしたり,設定ファイルを反映する設計が紹介されている.さらに,起動しているコンテナと同じ PID を指定し,メトリクスを取得するサンプルコンテナ topz
を起動するスクリプトも紹介されている.実際に nginx コンテナを起動してみる.
$ APP_ID=$(docker run -d -p 80:80 nginx:alpine) $ docker run --pid container:${APP_ID} -p 8080:8080 brendanburns/topz:db0fa58 /server -addr 0.0.0.0:8080 Serving on 0.0.0.0:8080
起動後に http://localhost:8080/topz
にアクセスすると,例えば以下のようなメトリクスを取得できる.
proc.PID
proc.CPUPercent
proc.MemoryPercent
proc.Command
7 39.88667159546271 0.030686773 nginx: worker process 8 9.952280506857287 0.13297603 /server -addr 0.0.0.0:8080 1 0 0.076651365 nginx: master process nginx -g daemon off;
このように本書には「ハンズオン」という内容もあり,読みながら実際に動かすこともできる.全体的に Kubernetes 前提のハンズオンも多くなっているけど,あくまでデザインパターンなので,Kubernetes 以外で動かしてみるのも勉強になると思う.
アンバサダ
「シングルノードパターン」の中で紹介されている「アンバサダ」は,アプリケーションと外部をプロキシする役割として使う.twemproxy など,ミドルウェアを Sharding するときに使う以外にも,「新システムの実験的運用やリクエスト分割への利用」でも使えるという内容もあり,A/B テストの設計として参考になる.ハンズオンもあり,具体的には nginx で server
に weight
を指定したコンテナを起動している.
ワークキューシステム
「バッチ処理パターン」の中で紹介されている「ワークキューシステム」も参考になる.パターン名を聞くと,単純にキューを使ったワーカー実装を想像するかもしれないけど,キューとは言え,Kafka / Redis など様々なミドルウェアがあり,キューに接続する部分も「アンバサダ」として一般化する設計になっている.さらに Kubernetes の ConfigMap を使って,ファイルベースにワークアイテムを伝達する仕組みなども紹介されている.
デコレータ
「マルチノードパターン」の中で紹介されている「ファンクションとイベント駆動処理」では FaaS (Function as a Service) の話題もある.FaaS のパターンとして,例えば「デコレータ」は,API リクエストのデフォルト値を埋めるなど,アプリケーションを呼び出す前の事前処理として使う.「シングルノードパターン」の中で紹介されている「アダプタ」と似ているけど,デコレータとアプリケーションを別々にスケールできる点がメリットであると書かれていた.
そして,FaaS をよりスケールさせるために,Kubernetes などのオーケストレーションツールの上で動く FaaS を使う案もあると書かれていた.例えば Kubeless や OpenFaaS など.なお OpenFaaS は日本語版のワークショップがあり,すぐに試すことができる.
関連情報
まず,本書の基礎となった論文が,2016年に「Design patterns for container-based distributed systems」として発表されている.本書にも載っている多くのパターンが紹介されていて,以前に論文を読んだ記事を書いている.合わせて読んでもらえると!
本書の補足資料は GitHub に公開されている.原著のリポジトリを fork して,本書のリポジトリも用意されている.
出版レビューに参加して
今回は本書の翻訳者を担当された @dblmkt さんから貴重な機会を頂き,本書の出版レビューに参加することができた.得意の「typo 発見スキル」を活かしつつ,日本語としてより適切な表現になるように「助詞」や「助動詞」など文章の見直しをしたり,直訳では伝わらなそうな文章を意訳する提案などもした.そして本書には Kubernetes を使ったサンプルも多くあり,Mac に環境構築をして動作確認もした.なんと言っても,出版レビューをご一緒させて頂いた @superbrothers さんと @yoshikai_ さんの的確なレビューコメントからもたくさん学ばせて頂いた!
今まで書籍レビューに参加した経験がなく,不慣れな部分もあったけど,とても貴重な経験となった.もしまた機会があれば挑戦したいと思う.出版日の数日前に本書が届き,自分の名前が載っている箇所を発見したときは「オライリー本に名前が載っている!おおおおお!」と感動した.なお,名前と Twitter アカウント名の間に改ページが入っていて,計2ページに名前が載っているところも見どころ!笑
まとめ
- 「分散システムデザインパターン」を読んだ
- コンテナを設計/運用するときに必要になる「デザインパターン」を学べる1冊になっている
- Kubernetes に限定せず,様々なオーケストレーションツールに活用できる
- 出版レビューに参加させて頂き,とても貴重な経験となった
分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計
- 作者: Brendan Burns,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2019/04/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る