kakakakakku blog

Weekly Tech Blog: Keep on Learning!

さぁ!コンテナを設計しよう /「分散システムデザインパターン」を読んだ

4月に出版された「分散システムデザインパターン」を読んだ.サブタイトルに「コンテナを使ったスケーラブルなサービスの設計」とある通り,コンテナを設計/運用するときに,どのようなデザインパターンを知っておくと良いのか?という点を学べる内容になっている.関連情報と合わせて書評を書きたいと思う.なお,今回は貴重な機会を頂き,本書の出版レビューに参加することができた.オライリー本に自分の名前が載っている!という喜びもある.

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

目次

  • 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 で serverweight を指定したコンテナを起動している.

nginx.org

ワークキューシステム

「バッチ処理パターン」の中で紹介されている「ワークキューシステム」も参考になる.パターン名を聞くと,単純にキューを使ったワーカー実装を想像するかもしれないけど,キューとは言え,Kafka / Redis など様々なミドルウェアがあり,キューに接続する部分も「アンバサダ」として一般化する設計になっている.さらに Kubernetes の ConfigMap を使って,ファイルベースにワークアイテムを伝達する仕組みなども紹介されている.

デコレータ

「マルチノードパターン」の中で紹介されている「ファンクションとイベント駆動処理」では FaaS (Function as a Service) の話題もある.FaaS のパターンとして,例えば「デコレータ」は,API リクエストのデフォルト値を埋めるなど,アプリケーションを呼び出す前の事前処理として使う.「シングルノードパターン」の中で紹介されている「アダプタ」と似ているけど,デコレータとアプリケーションを別々にスケールできる点がメリットであると書かれていた.

そして,FaaS をよりスケールさせるために,Kubernetes などのオーケストレーションツールの上で動く FaaS を使う案もあると書かれていた.例えば Kubeless や OpenFaaS など.なお OpenFaaS は日本語版のワークショップがあり,すぐに試すことができる.

kakakakakku.hatenablog.com

関連情報

まず,本書の基礎となった論文が,2016年に「Design patterns for container-based distributed systems」として発表されている.本書にも載っている多くのパターンが紹介されていて,以前に論文を読んだ記事を書いている.合わせて読んでもらえると!

kakakakakku.hatenablog.com

本書の補足資料は GitHub に公開されている.原著のリポジトリを fork して,本書のリポジトリも用意されている.

github.com

github.com

出版レビューに参加して

今回は本書の翻訳者を担当された @dblmkt さんから貴重な機会を頂き,本書の出版レビューに参加することができた.得意の「typo 発見スキル」を活かしつつ,日本語としてより適切な表現になるように「助詞」「助動詞」など文章の見直しをしたり,直訳では伝わらなそうな文章を意訳する提案などもした.そして本書には Kubernetes を使ったサンプルも多くあり,Mac に環境構築をして動作確認もした.なんと言っても,出版レビューをご一緒させて頂いた @superbrothers さんと @yoshikai_ さんの的確なレビューコメントからもたくさん学ばせて頂いた!

今まで書籍レビューに参加した経験がなく,不慣れな部分もあったけど,とても貴重な経験となった.もしまた機会があれば挑戦したいと思う.出版日の数日前に本書が届き,自分の名前が載っている箇所を発見したときは「オライリー本に名前が載っている!おおおおお!」と感動した.なお,名前と Twitter アカウント名の間に改ページが入っていて,計2ページに名前が載っているところも見どころ!笑

f:id:kakku22:20190513033018p:plain

まとめ

  • 「分散システムデザインパターン」を読んだ
  • コンテナを設計/運用するときに必要になる「デザインパターン」を学べる1冊になっている
  • Kubernetes に限定せず,様々なオーケストレーションツールに活用できる
  • 出版レビューに参加させて頂き,とても貴重な経験となった

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計