• Like
  • Save
  • Private Content
Developers Summit 2014 Summer 【B-4】LMQでお手軽分散システム開発
 

Developers Summit 2014 Summer 【B-4】LMQでお手軽分散システム開発

on

  • 235 views

夏サミ2014 【B-4】LMQでお手軽分散システム開発のスライドです

夏サミ2014 【B-4】LMQでお手軽分散システム開発のスライドです

Statistics

Views

Total Views
235
Views on SlideShare
221
Embed Views
14

Actions

Likes
1
Downloads
4
Comments
0

1 Embed 14

https://twitter.com 14

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Developers Summit 2014 Summer 【B-4】LMQでお手軽分散システム開発 Developers Summit 2014 Summer 【B-4】LMQでお手軽分散システム開発 Presentation Transcript

    • LMQ でお手軽 分散システム開発 Developers Summit 2014 Summer @yosisa
    • 自己紹介 — 田中 義久 — Software Engineer — Go / Python / Erlang / Swift — Internet Initiative Japan Inc. — Twitter: @yosisa — GitHub: @yosisa — Qiita: @yosisa
    • 社内での開発スタイル — 新監視システム開発チーム — メンバー6人 — GitHub Enterprise — 内製の CI サーバ — Docker / GCE
    • LMQLightweight Message Queue https://github.com/iij/lmq
    • LMQ メッセージキュー written in Erlang — プロセス間のデータの受け渡しに使う — REST 風の HTTP API で Put / Get — キューなのでデータを保持する
    • LMQ の目指すところ — 使いやすい — 運用しやすい — 十分に速い — メッセージをロストしない
    • 開発の動機
    • より良い 監視システム を作る
    • 旧来の監視システム (1) 監視データをローカルに格納している。 例えば、N 回連続で監視失敗したらアラート をあげる設定の時、ローカルにある過去の監 視データが無いと正確な判定ができない。 一度割り当てた監視ターゲットを別ホスト に移すのが難しい。
    • 旧来の監視システム (2) 監視の系を二重化して障害 に備えている。 通知が二重に出るのを防ぐ ために、集約処理をするプ ログラムがある。
    • 旧来の監視システム (2) 複数のアラートが起きた時 に、通知が多数でるのを防 ぐために、30秒∼10分間 の間でアラートを集約して いる。 集約プログラムにデータ が流れてくると、再起動が できなくて、メンテナン スが難しい。
    • 旧来の監視システム (3) 監視・解析・アラート担当 と、集約・通知担当の二段 構成。 ✘監視の生データを別の用 途に使う ✘システムの一部だけリプ レースする
    • 旧来の監視システム (4) もう8年くらい動いてる。 つまり、ベースのコードは相当古い。 テスト?なにそれおいしいの? 建て増しに次ぐ建て増しでカオス。 亜種がたくさんあってカオス。 Perl と C で書かれてて\(^o^)/
    • まとめると
    • もうこれ以上 面倒 みたくない!
    • \(^o^)/ — メンテナンスがすごく大変 — 設計や実装が古くて時代にそぐわない — デプロイが職人芸と化していて、デプロ イしたくないからコード書きたくない — でも新たな要求はやってくる
    • でも新たな 要求は やってくる
    • なら 作るしか ないじゃない
    • 新監視システム 毎分 10万 IPアドレスを監視できて、 監視ホストを追加するだけでスケールして、 プロセスの再起動に気を遣わなくてよく、 容易に機能追加できる拡張性のある、 近代的な開発手法で作られた、 そんな監視システム
    • おわかりいただけただ ろうか?
    • 大規模監視システムを支える LMQ
    • LMQ の特徴
    • LMQ の特徴 — HTTP REST API — シングル構成 / 冗長構成が可能 — 名前をつけて複数のキューを作成できる — キューの自動生成 — タイムアウトベースのメッセージ再送 — 時間ベースのメッセージ集約
    • Erlang/OTP の特徴 — 関数型言語 — 軽量プロセスモデル — Shared Nothing — プロセス間のメッセージパッシング — マルチコアを有効活用 — ネットワーク系の機能が Built-in
    • RabbitMQ との違い
    • Getting Started
    • インストール Erlang/OTP R16B01 以上が必要 $ git clone https://github.com/iij/lmq.git $ cd lmq $ make rel
    • 起動 $ rel/lmq/bin/lmq start 動作確認 $ rel/lmq/bin/lmq ping pong
    • Basic API
    • Put API POST /messages/:name キューにメッセージを追加する POST /messages/greeting HTTP/1.1 content-type: text/plain Hello, world! HTTP/1.1 200 OK content-type: application/json {"accum": "no"}
    • Get API GET /messages/:name キューからメッセージを取り出す GET /messages/greeting HTTP/1.1 HTTP/1.1 200 OK content-type: text/plain x-lmq-message-id: e93fd6b1-d408-4ecb-9f6b- d3eeebce34c1 x-lmq-message-type: normal x-lmq-queue-name: greeting Hello, world!
    • Reply API POST /messages/:name/:msgid?reply=:type メッセージの処理結果を通知する type は ack, nack, ext の3種類 — ack: 正常終了 -> メッセージを削除 — nack: 継続不能 -> メッセージを戻す — ext: 処理に時間がかかっている -> タイムアウトをリセット
    • Reply API POST /messages/:name/:msgid?reply=:type POST /messages/greeting/e93fd6b1-d408-4ecb- 9f6b-d3eeebce34c1?reply=ack HTTP/1.1 HTTP/1.1 204 No Content
    • Reply API POST /messages/:name/:msgid?reply=:type POST /messages/greeting/e93fd6b1-d408-4ecb- 9f6b-d3eeebce34c1?reply=ack HTTP/1.1 HTTP/1.1 404 Not Found
    • Multi Queue API
    • Multi Queue API 個々のキューを指定する代わりに、パターン にマッチする全てのキューを対象にする API。 パターンは正規表現で指定する。
    • Put all API POST /messages?qre=:regexp パターンにマッチする全てのキューにメッセ ージを追加する。 対象のキューはあらかじめ存在している必要 がある。
    • Put all API POST /messages?qre=:regexp POST /messages?qre=.* HTTP/1.1 Content-Type: application/json; charset=utf-8 {"text": "added via multi queue api"} HTTP/1.1 200 OK content-type: application/json { "greeting": {"accum": "no"} }
    • Get any API GET /messages?qre=:regexp パターンにマッチするいずれかのキューから取得 GET /messages?qre=.* HTTP/1.1 HTTP/1.1 200 OK content-type: application/json; charset=utf-8 x-lmq-message-id: 7cdfc909-ae9c-4704-bfa2-fd99612103e8 x-lmq-message-type: normal x-lmq-queue-name: greeting {"text": "added via multi queue api"}
    • ステータス
    • ステータス確認 $ rel/lmq/bin/lmq-admin status All nodes: lmq@127.0.0.1 Active nodes: lmq@127.0.0.1 greeting 1 messages 968 bytes accum: 0.0, retry: 2, timeout: 30.0 統計情報 $ rel/lmq/bin/lmq-admin stats greeting push rate: 1min 0.00, 5min 0.00, 15min 0.02, 1day 0.20 pull rate: 1min 0.00, 5min 0.00, 15min 0.00, 1day 0.00 retention time: min 0.000, max 0.000, mean 0.000, median 0.000
    • StatsD / Graphite / InfluxDB StatsD へのメトリクス送信に対応 Graphite や InfluxDB に統計情報を集約する ことが可能
    • タイムアウト
    • タイムアウト LMQ はメッセージが Get されてからの時間 を管理している。 timeout 値を超えると、そのメッセージが正 しく処理できなかったとみなしてキューに戻 す。 キューに戻ったメッセージは、他のクライア ントから Get できるようになる。
    • メッセージの集約
    • メッセージの集約 一定時間内に特定のキューに Put された全て のメッセージを集約して、時間経過後に1つ のメッセージとして Get できるようにする機 能のこと。 複数のコンテンツを含む以外は、通常のメッ セージと変わらない。 キューのプロパティを設定して有効化。
    • メッセージの集約 POST /messages/accum:seq HTTP/1.1 Content-Type: application/json; charset=utf-8 {"id": 1} HTTP/1.1 200 OK content-type: application/json {"accum": "new"} POST /messages/accum:seq HTTP/1.1 {"id": 2} HTTP/1.1 200 OK content-type: application/json {"accum": "yes"}
    • メッセージの集約 GET /messages/accum:seq HTTP/1.1 HTTP/1.1 200 OK content-type: multipart/mixed; boundary=fdaef3d8-934e-4272- b886-3f3212942f3b x-lmq-message-id: fdaef3d8-934e-4272-b886-3f3212942f3b x-lmq-message-type: compound x-lmq-queue-name: accum:seq --fdaef3d8-934e-4272-b886-3f3212942f3b Content-Type: application/json; charset=utf-8 {"id": 1} --fdaef3d8-934e-4272-b886-3f3212942f3b Content-Type: application/json; charset=utf-8 {"id": 2} --fdaef3d8-934e-4272-b886-3f3212942f3b--
    • メッセージの集約 GET /messages/accum:seq?cf=msgpack HTTP/1.1 HTTP/1.1 200 OK content-type: application/x-msgpack x-lmq-message-id: e227d532-01e7-42a0-b1bc-bea8efc710e4 x-lmq-message-type: compound x-lmq-queue-name: accum:seq ����content-type�application/json; charset=utf-8� {"id": 1} ���content-type�application/json; charset=utf-8� {"id": 2}
    • キューのプロパティ
    • キューのプロパティ 各キュー毎に動作をカスタマイズする仕組 み。 — timeout: メッセージが再送されるまでの 時間 — retry: メッセージの再送回数 — accum: メッセージを集約する時間
    • デフォルトプロパティ パターンにマッチするキューのプロパティを まとめて設定する仕組み。 大量のキューを使い分ける時に、個別に設定 しなくてすむ。 パターンは正規表現で記述する。
    • Property API
    • Get Queue Property GET /properties/:name GET /properties/greeting HTTP/1.1 HTTP/1.1 200 OK content-type: application/json { "accum": 0, "retry": 2, "timeout": 30 }
    • Update Queue Property PATCH /properties/:name PATCH /properties/greeting HTTP/1.1 Content-Type: application/json; charset=utf-8 {"accum": 30} HTTP/1.1 204 No Content
    • Reset Queue Property DELETE /properties/:name DELETE /properties/greeting HTTP/1.1 HTTP/1.1 204 No Content
    • Get Default Properties GET /properties GET /properties HTTP/1.1 HTTP/1.1 200 OK content-type: application/json [ ["^accum:", {"accum": 30}] ]
    • Set Default Properties PUT /properties PUT /properties HTTP/1.1 Content-Type: application/json; charset=utf-8 [ ["^accum:", {"accum": 30}] ] HTTP/1.1 204 No Content
    • Set Default Properties PUT /properties GET /properties/accum:notify HTTP/1.1 HTTP/1.1 200 OK content-type: application/json { "accum": 30, "retry": 2, "timeout": 30 }
    • Reset Default Properties DELETE /properties DELETE /properties HTTP/1.1 HTTP/1.1 204 No Content GET /properties HTTP/1.1 HTTP/1.1 200 OK content-type: application/json []
    • クラスタリング
    • クラスタリング 障害対策に2つ以上の LMQ ノードを使って クラスタを組むことができる。 マスターレスの実装。 キューの操作毎に sync する。
    • クラスタリング クラスタに参加 $ rel/lmq/bin/lmq-admin join lmq@lmq1.example.com クラスタから離脱 $ rel/lmq/bin/lmq-admin leave
    • Performance
    • Single
    • Cluster
    • Demo
    • ユースケース
    • プロセス間の連 携
    • プロセス間の連携 Producer と Consumer を 疎結合にできる。 どちらのプロセスも、いつ でも再起動できる。 Consumer をサーバのよう にする必要がない。 Consumer のキャパシティ を超えても、Producer に 影響しない。
    • プロセス間の連携 Producer / Consumer を自 由に増減できる。 Consumer を増やすだけで 負荷分散できる。
    • PubSub 風
    • PubSub 風 Notifier は event:.* パター ンを使って1度だけ Put す ればよい。 Event Handler は event:<hostname> から Get する。 Event Handler が一時的に down していても取りこぼ さない。
    • バッチ処理
    • バッチ処理 流れてくるメッセージをあ る程度まとめてから処理で きる。 1秒間まとめるだけでも、 後段の処理が 60回/分 にな り、バースト時の負荷を抑 えられる。 ex: メール、IRC、 ElasticSearch
    • Webhook Receiver
    • Webhook Receiver hook handler を HTTP Server にする必要がな い。 handler の数を調整するだ けで、直列処理 or 並列処 理を選択できる。 handler が fail しても、 hook 情報を失わない。
    • Desktop 通知
    • Desktop 通知 直接疎通がなくても、 LMQ に疎通があるもの同 士で通信できる。 NAT 配下や動的 IP 化にあ ることの多い Desktop 環 境で、サーバからの通知を 受け取れる。
    • まとめ
    • まとめ LMQ はプロセスを役割毎に分割しやすくす る。 LMQ を経由するポイントでシステムを拡張 しやすくなる。 複雑なシステムを、がんばって運用しなくて いい。
    • Thank you https://github.com/iij/lmq