Upload
katsunori-kawaguchi
View
18.192
Download
2
Embed Size (px)
DESCRIPTION
2011-10-18第1回Cloud Foundry輪読会#cfcrjp
Citation preview
NATSNATSNATSNATSをををを読読読読んだんだんだんだ。。。。
Katsunori Kawaguchi @hamakn
2011-10-18
第1回 Cloud Foundry 輪読会
Cloud Foundryのmessagingに利用されている、『NATS』の
コードを読んだので、そのまとめを、デモを交えつつ
共有したいと思います。
アジェンダ
1. コードリーディングの下準備、NATSとは?
2. NATSのコードリーディング
3. Cloud FoundryでのNATS(ちょっとだけ)
4. NATS cluster
自己紹介
• 川口 克則 @hamakn• NTTコム所属• Web/スマートフォンアプリの開発
主にRails
• 社内PaaSの第一候補としてCloud Foundryを検証中(2011年10月~)
コードリーディングの下準備NATSとは?
Cloud Foundry The building of the Open PaaS OSCON2011http://www.slideshare.net/derekcollison/oscon-2011
この実装がNATS
NATSとCloud Foundry
NATSとCloud Foundry(2)
青い矢印が
NATSのメッセージ Cloud Foundry The building of the Open PaaS OSCON2011
http://www.slideshare.net/derekcollison/oscon-2011
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
publish-subscribe messaging
• topicを介して多対多で通信するメッセージングモデル
• メリット:スケールさせやすい/疎結合にしやすい
送信側はメッセージをtopicにpublish
受信側はtopicをsubscribe
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などなど
Reactor pattern
• シングルスレッドのイベントループで非同期I/Oを実現するデザインパターン
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
デモ
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クライアント
デモ
ここまでのまとめ
1. Cloud FoundryはNATSを使っている2. NATSはEventMachineを使ったPub/Sub
メッセージングシステム3. Pub/Subはメッセージングの一方式4. EventMachineはReactorパターンによる
非同期I/Oを行うためのライブラリ5. EventMachineのサンプルを動かして
なんとなく慣れた
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 クラスタ構成時のルーティング
サンプルを動かす1
NATSServer
Subsubject:foo
Subsubject:bar
Pubsubject:foo
message:hello
Subsubject:foo
デモ
サンプルを動かす2
NATSServer
Subsubject:foo.>
Subsubject:foo
Pubsubject:foo.barmessage:hello Sub
subject:foo.*
Pubsubject:foo.bar.hoge
message:hello
デモ
サンプルを動かす3queue
NATSServer
Subsubject:foo
Subsubject:foo
Pubsubject:foo
message:hello
Subsubject:foo
3つのうちどれか1つにpublish
デモ
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
メッセージの送信
• 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行目)
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行目~に受信処理
メッセージングの例サンプルを動かす1 の場合
Server Sub PubINFO => ** <= CONNECT* <= SUB fooINFO => ** <= CONNECT* <= PUB foo hello!MSG hello! => hello!
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
NATSのテスト
• rspec• rspec/spec_helper.rb
– NatsServerControl超便利
NATSの問題点
• 現状single server• “cluster” blanchが存在• 設計方針
Cluster Design Overviewhttps://github.com/derekcollison/nats/wiki/Cluster-Design
なぜNATSなのか?
• 他の案– AMQP(RabbitMQ)– Storm– RestMS– XMPP
• RubyWorld Conf. / Why ruby?– Allows great productivity and rapid iteration– Language perfomance is not always key
Cloud FoundryでのNATS(ちょっとだけ)
NATS Server(NATSD)の起動
• @ bin/vcap`#{nats_server} –p #{@uri.port} –P #{@pid_file} –d 2>
/dev/null`
• 現状、全てのvcapサーバでnats serverが動作してしまう(本来 mbus:// で指定されるサーバ以外は不要)
NATSとCloud Foundry(2)青い
矢印がNATSの
メッセージ
Cloud Foundry The building of the Open PaaS OSCON2011http://www.slideshare.net/derekcollison/oscon-2011
NATSが落ちても
Serviceは動くはず?
まとめ
1. NATSはEventMachineを使ったPub/Subメッセージングシステム
2. コード量は小さめだし、コード、テスト(spec)ともに丁寧なのでRuby初級者にもお勧め
3. Cluster対応版はまだですか?
質問タイム
サンプルを動かす4authentication
サンプルを動かす5reply
NATSの概要他のPaaSでのmessagingの実装
• 情報お待ちしております<(_ _)>
未調査不明AppScaleTyphoonAE
RabbitMQのProjects involving RabbitMQに”App Engine imprementation”とあるが何に使っているかは不明
不明GAE不明 RoutingはErlangベースの独自実装heroku