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 に限定せず,様々なオーケストレーションツールに活用できる
  • 出版レビューに参加させて頂き,とても貴重な経験となった

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

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

小学生に限らず幅広い層に役立つドリルだった / ドリルの王様「たのしいプログラミング」を3冊解いた

少し前に書店をブラブラしていたら,なんと!小学生の学習書コーナーに「プログラミング」をテーマにした「学習ドリル」が追加されていて,とても驚いた.2020年からプログラミング教育が小学校の必修科目になることは知っていたけど,まさかもう学習ドリルまで出版されているとは!学習指導要領など,詳しくは文部科学省のウェブサイトから確認できる.

www.mext.go.jp

僕自身は過去にプログラミング講師の仕事を約2年していて,主に「プログラミング初学者に教えた経験(成人教育)」はあるけど,小学生にはどのように教えるのだろうか?という強い興味があり,以下の3冊を購入し,実際に解いてみた.

プログラミング的思考

本書にも書いてある通り,「プログラミング」を学ぶのではなく「プログラミング的思考」を学ぶ.よって Scratch を使ったりするのではなく「どのように考えるか?」という観点で学ぶ.具体的には「順序」「繰り返し」「分岐」など,実際にプログラミングをするときに必要になる思考を学ぶことができる.学習指導要領(第2版)にも書いてある通り,小学校のプログラミング教育では「プログラミングを体験すること」を推奨しているため,Scratch などのビジュアル型プログラミング言語を使った授業もあると思う.よって,本書(学習ドリル)は,実際にプログラミングを体験するときに必要になる「プログラミング的思考」を学ぶためにあるという背景を理解しておくと良さそう.

3冊を実際に解いてみた個人的な感想として,非常によく考えられていると感じた.特に本書は小学生に限らず,例えば以下など,幅広い層に役立つ内容になっている点が素晴らしいと感じた.ようするに「誰でも読める」と言える.小学生の学習ドリルを侮るなかれ!

  • 小学生
  • 小学生の子供に「プログラミング的思考」を教える保護者
  • 現役のプログラミング講師
  • エンジニアと会話ができるようになりたい営業職や経営陣
  • などなど

学習範囲

ザッと3冊に載っている学習範囲を整理してみた.非常に幅広い内容になっていることがわかる.なお,実際には「じゅんじょ」「順序」など,表記は年次によって異なり,適切に「学年別漢字配当表」に沿っている.本記事では読者層を考慮し,通常通り,漢字表記に統一する.

学習範囲 小学1,2年 小学3,4年 小学5,6年
順序
繰り返し
分岐
イベント処理 - -
コンピュータの考え方
変数
関数 -
配列 - -
アルゴリズム -
データ活用 - -
移り変わり図 - -

小学1,2年

出題範囲「順序」では,積み木を並べたり,図形を組み合わせたり,順番を考える問題になっている.途中から「フローチャート」を使った問題もあり,「フローチャート」を読み解きながら図を描いたり,ロボットを動かしたりする.正確には問題文には「フローチャート」という言葉は記載されてなく,答え(保護者向け)に載っている.

出題範囲「分岐」では,if-else を連想させる「分かれ道でどっちに進む?」というテーマや「○だったら図形 A,△だったら図形 B」というテーマなど,小学生でも考えやすい内容になっている.出題範囲「分岐」の後半では「フローチャート」を使って「クッキーは丸い?」という命令を読み解く内容になっている.

出題範囲「イベント処理」では,「大型ロボットが迷路を進む」というテーマで「壁にぶつかったら,左を向く」など「壁にぶつかったら〇〇」という点にフォーカスして読み解く.客観的には出題範囲「分岐」と似ている部分もある.

小学3,4年

「順序」「繰り返し」「分岐」など,学習範囲は小学1,2年と同じで,問題の複雑さが違ってくる.例えば,出題範囲「繰り返し」では「秘密の暗号を読み解く」というテーマで,文字列を数文字ごと(鍵という前提)にスキップしながら読み解く問題になっている.例えば以下のように,プログラミング的には For Step を連想させる内容になっている.

鍵 = 2
暗号 = ぶあろいぐう
メッセージ = ぶろぐ

小学1,2年にも出てくる出題範囲「変数」では,「ロボットに1個だけ言葉を教えることができる」というテーマで「変数の代入」を表現していて参考になる.特にロボットに言葉を教えるだけではなく,ロボット同士でも言葉を教える問題があり,これは「変数同士の代入」のことを連想させている.

そして,最後に出題範囲「アルゴリズム」も出てくる.問題文には記載されていないけど,答え(保護者向け)を読むと,以下の代表的なアルゴリズムを前提にした問題が並んでいる.ここまで理解した小学生強すぎる!

  • 交換アルゴリズム
  • 探索アルゴリズム
    • 線形探索
    • 二分探索
    • 深さ優先探索
  • ソートアルゴリズム
    • 選択ソート

小学5,6年

小学1,2,3,4年でも学ぶ学習範囲はさらに問題が複雑になってくる.特に学習範囲「変数」に関しては「変数同士の代入」の延長線として「変数を計算した結果を変数に代入する」という問題もある.

そして,学習範囲「関数」では,以下のように命令を読み解く内容もある.後半には「関数の中に関数を定義した」問題もあり,非常に実践的な「プログラミング的思考」を学べる.学習指導要領(第2版)に書いてある通り,プログラミング教育では「プログラミングによって正多角形を作図する」ことを目標の1個にしているため,学習範囲「関数」の内容と似ていると感じた.

進む (1)
左回り ()
進む (5)

学習範囲「アルゴリズム」では,小学3,4年で学んだ内容に加えて,以下の内容を前提にした問題が出てくる.そして,学習範囲「データ活用」では RDB を連想させるデータ表を読み解く問題になっている.学習範囲「移り変わり図」では「アクティビティ図」「状態遷移図」を学ぶ.小学5,6年でここまで学べるのは本当に驚き!

  • ソートアルゴリズム
    • バブルソート
  • 最短経路問題
    • ダイクストラ法
  • ナップサック問題

まとめ

  • ドリルの王様「たのしいプログラミング」を3冊解いた
  • 本書では「プログラミング」ではなく「プログラミング的思考」を学ぶ
  • 小学生に限らず,幅広い層に役立つ内容になっていた

関連記事

経営陣にエンジニアリングをもっと知ってもらうために「SAO 本」を使ってプログラムを写経してもらう取り組みを数年前に実施したけど,当時このドリルがあったら是非活用したかった!「開発組織の変革を支えた実践的アプローチ」に関しては以下に資料を公開している.

kakakakakku.hatenablog.com

最新バージョン Redash v7.0.0 をすぐに試せる「Redash ハンズオン資料」

2019年3月末に Redash の最新バージョン「Redash v7.0.0」がリリースされた.2018年12月に「Redash v6.0.0」がリリースされたので,比較的ハイペースにメジャーバージョンアップが進んでいる.Change Log を読むと「Redash v7.0.0」の新機能が多くあり,既に以下の記事にまとめている.目玉機能と言える「選択実行」もある.

kakakakakku.hatenablog.com

Redash ハンズオン資料 v7.0.0 サポート

さっそく「Redash ハンズオン資料」「Redash v7.0.0」をサポートした.個人学習用途/研修用途など,サクッと Redash v7.0.0 を試すときに使ってもらえると!メジャーバージョンは v2 / v4 / v5 / v6 / v7 をサポートしている.主な変更点を以下にまとめる.

  • 全てのスクリーンキャプチャを撮り直した
  • 「選択実行」を試せるようにした
  • docker-compose.yml を Redash 公式の Setup Script に合わせて修正した
  • UI 変更に合わせて文章を一部変更した

github.com

関連記事

マイクロサービスの学習に使えるサンプルアプリケーション「Sock Shop」

個人学習用にマイクロサービスを体験できるサンプルアプリケーションを探していたら,Weaveworks から公開されている「Sock Shop」を発見した.「Sock Shop」は名前の通り「靴下 EC サイト」「ユーザー登録/商品閲覧/カート/ウィッシュリスト/購入(ダミー)」など,EC サイトに必要な機能が一通り実装されている.ドキュメントに以下の記載があり,マイクロサービスを体験したり,デモに使ったり,トレーニングに使ったりする用途に適している.良さそう!

Sock Shop can be used to illustrate microservices architectures, demonstrate platforms at talks and meetups, or as a training and education tool.

microservices-demo.github.io

Sock Shop を動かす

「Sock Shop」は Docker / Kubernetes / Amazon ECS など,多くのプラットフォームをサポートしている.今回はお手軽に試すため,Docker Desktop for Mac と Docker Compose を使って動かす.ドキュメントにある Quick Start も Docker Compose を使う手順になっている.以下のように GitHub リポジトリを clone し,Docker Compose を起動すると,「計15種類」のコンテナが起動する.

$ git clone https://github.com/microservices-demo/microservices-demo
$ cd microservices-demo
$ docker-compose -f deploy/docker-compose/docker-compose.yml up -d
(中略)
Creating docker-compose_rabbitmq_1     ... done
Creating docker-compose_user_1         ... done
Creating docker-compose_user-db_1      ... done
Creating docker-compose_front-end_1    ... done
Creating docker-compose_carts-db_1     ... done
Creating docker-compose_orders_1       ... done
Creating docker-compose_orders-db_1    ... done
Creating docker-compose_edge-router_1  ... done
Creating docker-compose_user-sim_1     ... done
Creating docker-compose_carts_1        ... done
Creating docker-compose_payment_1      ... done
Creating docker-compose_catalogue_1    ... done
Creating docker-compose_catalogue-db_1 ... done
Creating docker-compose_queue-master_1 ... done
Creating docker-compose_shipping_1     ... done

起動後に http://localhost に接続すると,すぐに「Sock Shop」にアクセスできる.

f:id:kakku22:20190426142844p:plain

靴下を検索することもできる.

f:id:kakku22:20190426142914p:plain

カート機能も充実している.

f:id:kakku22:20190426143044p:plain

マイクロサービス紹介

「計15種類」のコンテナで使われている技術をザッと整理すると以下のようになる.マイクロサービスごとに言語とデータストアが異なり,まさにマイクロサービスの思想でもある「ポリグロット (Polyglot)」な構成になっている.Go API の実装を読んでいると「OpenTracing」を使っていたり,負荷テストに「Locust」を使っていたり,コンテナごとに詳しく調べていく楽しさもある.また Go API の Dockerfile を確認したところ「multi-stage builds 機能」も使っていて,学べる点も多くある.コンテナ同士の関係はdocker-compose.yml に書いてある.

github.com

API 紹介

API ごとに Swagger ドキュメントがあり,簡単に API 仕様を確認できる.試しに「カタログ API」を実行すると以下のようになる.

$ curl -s http://localhost/catalogue/d3588630-ad8e-49df-bbd7-3167f7efb246 | jq .
{
  "id": "d3588630-ad8e-49df-bbd7-3167f7efb246",
  "name": "YouTube.sock",
  "description": "We were not paid to sell this sock. It's just a bit geeky.",
  "imageUrl": [
    "/catalogue/images/youtube_1.jpeg",
    "/catalogue/images/youtube_2.jpeg"
  ],
  "price": 10.99,
  "count": 801,
  "tag": [
    "geek",
    "formal"
  ]
}

まとめ

  • マイクロサービスを体験できるサンプルアプリケーションとして「Sock Shop」を発見した
  • EC サイトに必要な機能が一通り実装されている
  • 引き続きマイクロサービスの実装を読み解きながら「Sock Shop」の詳細を追っていく

SQL 選択実行など便利な新機能が追加された「Redash v7.0.0」紹介

2019年3月末に Redash の最新バージョン「Redash v7.0.0」がリリースされた.Change Log を読むと機能追加が多くあり,今回は「個人的に気になった Redash v7 新機能(もしくは UI 変更)」「9点」紹介しようと思う.

もし既存環境を Redash v7 にアップデートするのであれば,GitHub に公開されている docker-compose.yml と以下のドキュメントを確認しておくこと.バックアップを忘れずに!

redash.io

1. Version 表記

細かな UI 変更ではあるけど,Redash v6 までフッターにあった Version 表記が Redash v7 ではメニューバーに移動していた.個人的にはフッターがスッキリして良いかなと!

f:id:kakku22:20190414205148p:plain

2. Knowledge Base

Redash の操作に悩んだときによく見る「Redash Help (Knowledge Base)」のリンクがナビゲーションバーに追加されていた.全文検索にも対応しているし,結構使うことになりそう.Redash の普及に合わせて,ユーザーフレンドリーな UI 変更も増えている印象がある.

f:id:kakku22:20190414205731p:plain

3. データソース追加

Redash はバージョンアップごとに対応データソースを増やしている.今回 Redash v7 では「計5種類」追加となり「計44種類」になった.今後もどんどん増えていきそう!

  • Amazon Elasticsearch Service
  • Apache Drill
  • Mapd
  • Snowflake
  • Uptycs

f:id:kakku22:20190414205828p:plain

4. SQL 選択実行

個人的に Redash v7 で神アップデートだと感じるのは「SQL 選択実行」で,SQL の一部を選択して実行できるようになった.データ分析をするときはサブクエリを多用することもあるけど,今までだと SQL ごとに実行確認をしながら組み立てる必要があり,比較的面倒なオペレーションだと感じていた.Redash v7 では大規模 SQL を書くときもストレスなく使える.最高!

f:id:kakku22:20190414210510p:plain

5. クエリ自動実行

今までもあった「Refresh Schedule」「終了日 (Ends)」を設定できるようになった.広告出稿中など,限定的な期間にクエリ自動実行をできるようになり,より自由度が高くなったと思う.

f:id:kakku22:20190414210903p:plain

6. 最終アクセス日時

Redash User 管理画面に「最終アクセス日時 (Last Active At)」の項目が追加された.Redash 運用担当の視点から作られたまま放置された Redash User を精査するときなどに使えそう.

f:id:kakku22:20190414211045p:plain

7. 招待中

Redash v6 だと Redash User 管理画面に「Active Users」「Disabled Users」しかなく,今回 Redash v7 では「Pending Invitations」も追加された.Active と Pending を区別できるのは Redash 運用担当だと助かる機能と言える.

f:id:kakku22:20190414211225p:plain

8. User API Key 更新

Redash v7 では User API Key を「更新 (Regenerate)」できるようになった.コンプライアンス的に要件はありそう.とは言え,推奨は User API Key ではなく Query API Key となり,使う前に一度ドキュメントを読んでおくと良いと思う.詳しくは過去記事にまとめてある.

kakakakakku.hatenablog.com

f:id:kakku22:20190414211419p:plain

9. Google Hangouts Chat 通知

アラート機能の通知先に「Google Hangouts Chat」が追加された.データソースと同じく,必要に応じてどんどん増えていく気がする.

f:id:kakku22:20190414211711p:plain

まとめ

  • Redash v7.0.0 を試した
  • 個人的に気になった新機能(もしくは UI 変更)を「9点」紹介した
  • 「SQL 選択実行」は Redash v7 の神アップデートだと思う
  • Redash ハンズオン資料 (redash-hands-on) の v7 対応はもう少しお待ちを🙏

github.com