36
NATS NATS NATS NATSを を読 読んだ んだ んだ んだ。 Katsunori Kawaguchi @hamakn 2011-10-18 第1回 Cloud Foundry 輪読会

Reading NATS

Embed Size (px)

DESCRIPTION

2011-10-18第1回Cloud Foundry輪読会#cfcrjp

Citation preview

Page 1: Reading NATS

NATSNATSNATSNATSをををを読読読読んだんだんだんだ。。。。

Katsunori Kawaguchi @hamakn

2011-10-18

第1回 Cloud Foundry 輪読会

Page 2: Reading NATS

Cloud Foundryのmessagingに利用されている、『NATS』の

コードを読んだので、そのまとめを、デモを交えつつ

共有したいと思います。

Page 3: Reading NATS

アジェンダ

1. コードリーディングの下準備、NATSとは?

2. NATSのコードリーディング

3. Cloud FoundryでのNATS(ちょっとだけ)

4. NATS cluster

Page 4: Reading NATS

自己紹介

• 川口 克則 @hamakn• NTTコム所属• Web/スマートフォンアプリの開発

主にRails

• 社内PaaSの第一候補としてCloud Foundryを検証中(2011年10月~)

Page 5: Reading NATS

コードリーディングの下準備NATSとは?

Page 6: Reading NATS

Cloud Foundry The building of the Open PaaS OSCON2011http://www.slideshare.net/derekcollison/oscon-2011

この実装がNATS

NATSとCloud Foundry

Page 7: Reading NATS

NATSとCloud Foundry(2)

青い矢印が

NATSのメッセージ Cloud Foundry The building of the Open PaaS OSCON2011

http://www.slideshare.net/derekcollison/oscon-2011

Page 8: Reading NATS

NATShttps://github.com/derekcollison/nats/

• A lightweight EventMachine basedpublish-subscribe messaging system.

• Rubyで実装• 依存gem

– eventmachine, json_pure, daemons, thin

• ver0.4.10ではsingle server design < SPOF

Page 9: Reading NATS

publish-subscribe messaging

• topicを介して多対多で通信するメッセージングモデル

• メリット:スケールさせやすい/疎結合にしやすい

送信側はメッセージをtopicにpublish

受信側はtopicをsubscribe

Page 10: Reading NATS

EventMachinehttp://rubyeventmachine.com/

• Fast, simple event-processing libraryfor Ruby programs.

• 非同期I/O処理を行えるライブラリ• Reactor pattern

– Rubyだと他にcool.io(旧rev)など– 他言語であればnode.js, AnyEvent, Twistedなど

• 利用例– thin(httpd), em-websocketなどなど

Page 11: Reading NATS

Reactor pattern

• シングルスレッドのイベントループで非同期I/Oを実現するデザインパターン

Page 12: Reading NATS

EventMachineのサンプル1エコーサーバ

require 'eventmachine'

module Echodef receive_data(data)

send_data(data)end

end

EM.run doEM.start_server("0.0.0.0", 10000, Echo)

end

デモ

Page 13: Reading NATS

require 'eventmachine'

hosts = [“www.google.co.jp”, “www.yahoo.co.jp”]hosts_size = hosts.sizeEM.run do

hosts.each do |h|http = EM::Protocols::HttpClient.request(:host =>

h, :port => 80, :request => “/”)http.callback do |response|

p response[:status]EM.stop if (hosts_size -= 1) <= 0

endend

end

EventMachineのサンプル2HTTPクライアント

デモ

Page 14: Reading NATS

ここまでのまとめ

1. Cloud FoundryはNATSを使っている2. NATSはEventMachineを使ったPub/Sub

メッセージングシステム3. Pub/Subはメッセージングの一方式4. EventMachineはReactorパターンによる

非同期I/Oを行うためのライブラリ5. EventMachineのサンプルを動かして

なんとなく慣れた

Page 15: Reading NATS

NATSのコードリーディング

Page 16: Reading NATS

ファイル構成

• libnats/client.rb NATSクライアントnats/server.rb NATSサーバの起動nats/server/server.rb NATSサーバ本体nats/server/connection.rb コネクションのメッセージ処理などnats/server/sublist.rb Subscriberのリスト管理nats/server/options.rb 起動オプションのパースnats/ext/ JrubyやRuby1.8.6へのパッチなど

• bin サーバやクライアントの起動コマンド• spec テストコード• examples サンプルコード• benchmark ベンチーマークコード

• lib “cluster” branchのみnats/server/cluster.rb NATSサーバを束ねるクラスタ本体nats/server/route.rb クラスタ構成時のルーティング

Page 17: Reading NATS

サンプルを動かす1

NATSServer

Subsubject:foo

Subsubject:bar

Pubsubject:foo

message:hello

Subsubject:foo

デモ

Page 18: Reading NATS

サンプルを動かす2

NATSServer

Subsubject:foo.>

Subsubject:foo

Pubsubject:foo.barmessage:hello Sub

subject:foo.*

Pubsubject:foo.bar.hoge

message:hello

デモ

Page 19: Reading NATS

サンプルを動かす3queue

NATSServer

Subsubject:foo

Subsubject:foo

Pubsubject:foo

message:hello

Subsubject:foo

3つのうちどれか1つにpublish

デモ

Page 20: Reading NATS

NATSサーバの起動@ lib/nats/server.rb 25行目~

• 左:EMのechoサーバrequire 'eventmachine'

module Echodef receive_data(data)

send_data(data)end

end

EM.run doEM.start_server("0.0.0.0", 10000, EchoEchoEchoEcho)

end

• 右:NATSサーバの開始EM.run do

EM.start_server(NATSD::Server.host,NATSD::Server.port,NATSD::ConnectionNATSD::ConnectionNATSD::ConnectionNATSD::Connection

)end

Page 21: Reading NATS

メッセージの送信

• SubscribeNATS.start

NATS.subscribe(subject) {|msg, _, sub|puts “#{header} Receive on [#{sub}] : ‘#{msg}’”

}end(@ bin/nats-sub 35行目)

• PublishNATS.start

NATS.publish(subject, msg) { NATS.stop }end(@ bin/nats-pub 23行目)

Page 22: Reading NATS

NATSのプロトコル“OP foo queue 2/r/n” 的メッセージが飛ぶ

OPが命令• クライアント→サーバ

– PUB– SUB– UNSUB– PING– PONG– CONNECT– INFO– UNKNOWN

• lib/nats/server/connection.rb 57行目~ に受信処理

• サーバ→クライアント– MSG– OK– ERR– PING– PONG– INFO– UNKNOWN

• lib/nats/client.rb 446行目~に受信処理

Page 23: Reading NATS

メッセージングの例サンプルを動かす1 の場合

Server Sub PubINFO => ** <= CONNECT* <= SUB fooINFO => ** <= CONNECT* <= PUB foo hello!MSG hello! => hello!

Page 24: Reading NATS

Sublistの管理@ lib/nats/server/sublist.rb

• subject “foo”, “bar”, “foo.*”, “foo.>”を実現する仕組み

Struct Subscriber:conn NATSD::Connectionのインスタンス

struct SublistLevel:nodes subject => SublistNodeのハッシュ:pwc subject=“*”時のSublistNode:fwc subject=“>”時のSublistNode

struct SublistNode:leaf_nodes NATSD::Subscriber の配列:next_level SublistLevel

Page 25: Reading NATS

NATSのテスト

• rspec• rspec/spec_helper.rb

– NatsServerControl超便利

Page 26: Reading NATS

NATSの問題点

• 現状single server• “cluster” blanchが存在• 設計方針

Cluster Design Overviewhttps://github.com/derekcollison/nats/wiki/Cluster-Design

Page 27: Reading NATS

なぜNATSなのか?

• 他の案– AMQP(RabbitMQ)– Storm– RestMS– XMPP

• RubyWorld Conf. / Why ruby?– Allows great productivity and rapid iteration– Language perfomance is not always key

Page 28: Reading NATS

Cloud FoundryでのNATS(ちょっとだけ)

Page 29: Reading NATS

NATS Server(NATSD)の起動

• @ bin/vcap`#{nats_server} –p #{@uri.port} –P #{@pid_file} –d 2>

/dev/null`

• 現状、全てのvcapサーバでnats serverが動作してしまう(本来 mbus:// で指定されるサーバ以外は不要)

Page 30: Reading NATS

NATSとCloud Foundry(2)青い

矢印がNATSの

メッセージ

Cloud Foundry The building of the Open PaaS OSCON2011http://www.slideshare.net/derekcollison/oscon-2011

NATSが落ちても

Serviceは動くはず?

Page 31: Reading NATS

まとめ

1. NATSはEventMachineを使ったPub/Subメッセージングシステム

2. コード量は小さめだし、コード、テスト(spec)ともに丁寧なのでRuby初級者にもお勧め

3. Cluster対応版はまだですか?

Page 32: Reading NATS

質問タイム

Page 33: Reading NATS
Page 34: Reading NATS

サンプルを動かす4authentication

Page 35: Reading NATS

サンプルを動かす5reply

Page 36: Reading NATS

NATSの概要他のPaaSでのmessagingの実装

• 情報お待ちしております<(_ _)>

未調査不明AppScaleTyphoonAE

RabbitMQのProjects involving RabbitMQに”App Engine imprementation”とあるが何に使っているかは不明

不明GAE不明 RoutingはErlangベースの独自実装heroku