第1回 Cloud Foundry 輪読会NATSを んだ。NATSを読んだ。   Katsunori Kawaguchi        @hamakn       2011-10-18
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とは?
NATSとCloud Foundry この実装がNATS           Cloud Foundry The building of the Open PaaS OSCON2011              http://www.slide...
NATSとCloud Foundry(2)   青い  矢印が NATSのメッセージ       Cloud Foundry The building of the Open PaaS OSCON2011               http:...
NATS  https://github.com/derekcollison/nats/• A lightweight EventMachine based  publish-subscribe messaging system.• Rubyで...
publish-subscribe messaging                       受信側はtopicを                        subscribe送信側はメッセージを  topicにpublish • t...
EventMachine       http://rubyeventmachine.com/• Fast, simple event-processing library  for Ruby programs.• 非同期I/O処理を行えるライ...
Reactor pattern• シングルスレッドの  イベントループで  非同期I/Oを実現する  デザインパターン
EventMachineのサンプル1            エコーサーバrequire eventmachinemodule Echo  def receive_data(data)    send_data(data)  endendEM.r...
EventMachineのサンプル2          HTTPクライアントrequire eventmachinehosts = [“www.google.co.jp”, “www.yahoo.co.jp”]hosts_size = host...
ここまでのまとめ1. Cloud FoundryはNATSを使っている2. NATSはEventMachineを使ったPub/Sub   メッセージングシステム3. Pub/Subはメッセージングの一方式4. EventMachineはReac...
NATSのコードリーディング
ファイル構成• lib  nats/client.rb              NATSクライアント  nats/server.rb              NATSサーバの起動  nats/server/server.rb       N...
サンプルを動かす1                             Sub                         subject:foo     Pub                NATS         Sub subj...
サンプルを動かす2                                     Sub                                subject:foo.>      Pubsubject:foo.bar mes...
サンプルを動かす3               queue                                    Sub                                subject:foo     Pub   ...
NATSサーバの起動    @ lib/nats/server.rb 25行目~• 左:EMのechoサーバ                 • 右:NATSサーバの開始require eventmachine         EM.run d...
メッセージの送信• SubscribeNATS.start  NATS.subscribe(subject) {|msg, _, sub|    puts “#{header} Receive on [#{sub}] : ‘#{msg}’”  ...
NATSのプロトコル   “OP foo queue 2/r/n” 的メッセージが飛ぶ                 OPが命令• クライアント→サーバ                     • サーバ→クライアント   –   PUB  ...
メッセージングの例      サンプルを動かす1 の場合Server            Sub            PubINFO         =>   **            <=   CONNECT*            <...
Sublistの管理    @ lib/nats/server/sublist.rb• subject “foo”, “bar”, “foo.*”, “foo.>”  を実現する仕組みStruct Subscriber  :conn     N...
NATSのテスト• rspec• rspec/spec_helper.rb  – NatsServerControl超便利
NATSの問題点• 現状single server• “cluster” blanchが存在• 設計方針  Cluster Design Overview  https://github.com/derekcollison/nats/  wik...
なぜNATSなのか?• 他の案  –   AMQP(RabbitMQ)  –   Storm  –   RestMS  –   XMPP• RubyWorld Conf. / Why ruby?  – Allows great producti...
Cloud FoundryでのNATS   (ちょっとだけ)
NATS Server(NATSD)の起動• @ bin/vcap`#{nats_server} –p #{@uri.port} –P #{@pid_file} –d 2>  /dev/null`• 現状、全てのvcapサーバで  nats s...
青い  矢印が    NATSとCloud NATSの            Foundry(2)メッセージ   NATSが  落ちても Serviceは動くはず?            Cloud Foundry The building o...
まとめ1. NATSはEventMachineを使ったPub/Sub   メッセージングシステム2. コード量は小さめだし、   コード、テスト(spec)ともに丁寧なので   Ruby初級者にもお勧め3. Cluster対応版はまだですか?
質問タイム
サンプルを動かす4 authentication
サンプルを動かす5   reply
NATSの概要    他のPaaSでのmessagingの実装heroku      不明   RoutingはErlangベースの独自実装GAE         不明   RabbitMQのProjects involving        ...
Reading NATS
Upcoming SlideShare
Loading in...5
×

Reading NATS

18,631

Published on

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

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
18,631
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
79
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Transcript of "Reading NATS"

  1. 1. 第1回 Cloud Foundry 輪読会NATSを んだ。NATSを読んだ。 Katsunori Kawaguchi @hamakn 2011-10-18
  2. 2. Cloud Foundryのmessagingに利用されている、『NATS』の コードを読んだので、 そのまとめを、 デモを交えつつ 共有したいと思います。
  3. 3. アジェンダ1. コードリーディングの下準備、NATSとは?2. NATSのコードリーディング3. Cloud FoundryでのNATS(ちょっとだけ)4. NATS cluster
  4. 4. 自己紹介• 川口 克則 @hamakn• NTTコム所属• Web/スマートフォンアプリの開発 主にRails• 社内PaaSの第一候補として Cloud Foundryを検証中(2011年10月~)
  5. 5. コードリーディングの下準備 NATSとは?
  6. 6. NATSとCloud Foundry この実装がNATS Cloud Foundry The building of the Open PaaS OSCON2011 http://www.slideshare.net/derekcollison/oscon-2011
  7. 7. NATSとCloud Foundry(2) 青い 矢印が NATSのメッセージ Cloud Foundry The building of the Open PaaS OSCON2011 http://www.slideshare.net/derekcollison/oscon-2011
  8. 8. NATS https://github.com/derekcollison/nats/• A lightweight EventMachine based publish-subscribe messaging system.• Rubyで実装• 依存gem – eventmachine, json_pure, daemons, thin• ver0.4.10ではsingle server design < SPOF
  9. 9. publish-subscribe messaging 受信側はtopicを subscribe送信側はメッセージを topicにpublish • topicを介して多対多で通信する メッセージングモデル • メリット:スケールさせやすい/疎結合にしやすい
  10. 10. EventMachine http://rubyeventmachine.com/• Fast, simple event-processing library for Ruby programs.• 非同期I/O処理を行えるライブラリ• Reactor pattern – Rubyだと他にcool.io(旧rev)など – 他言語であればnode.js, AnyEvent, Twistedなど• 利用例 – thin(httpd), em-websocketなどなど
  11. 11. Reactor pattern• シングルスレッドの イベントループで 非同期I/Oを実現する デザインパターン
  12. 12. EventMachineのサンプル1 エコーサーバrequire eventmachinemodule Echo def receive_data(data) send_data(data) endendEM.run do EM.start_server("0.0.0.0", 10000, Echo)end デモ
  13. 13. EventMachineのサンプル2 HTTPクライアントrequire eventmachinehosts = [“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 end endend デモ
  14. 14. ここまでのまとめ1. Cloud FoundryはNATSを使っている2. NATSはEventMachineを使ったPub/Sub メッセージングシステム3. Pub/Subはメッセージングの一方式4. EventMachineはReactorパターンによる 非同期I/Oを行うためのライブラリ5. EventMachineのサンプルを動かして なんとなく慣れた
  15. 15. NATSのコードリーディング
  16. 16. ファイル構成• lib nats/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 クラスタ構成時のルーティング
  17. 17. サンプルを動かす1 Sub subject:foo Pub NATS Sub subject:foo subject:foomessage:hello Server Sub subject:barデモ
  18. 18. サンプルを動かす2 Sub subject:foo.> Pubsubject:foo.bar message:hello NATS Sub subject:foo.* Server Pubsubject:foo.bar.hoge message:hello Sub subject:foo デモ
  19. 19. サンプルを動かす3 queue Sub subject:foo Pub NATS Sub subject:foo subject:foomessage:hello Server 3つのうち Sub どれか1つにpublish subject:fooデモ
  20. 20. NATSサーバの起動 @ lib/nats/server.rb 25行目~• 左:EMのechoサーバ • 右:NATSサーバの開始require eventmachine EM.run do EM.start_server(module Echo NATSD::Server.host, def receive_data(data) NATSD::Server.port, send_data(data) NATSD::Connection end )end endEM.run do EM.start_server("0.0.0.0", 10000, Echo) Echoend
  21. 21. メッセージの送信• 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行目)
  22. 22. NATSのプロトコル “OP foo queue 2/r/n” 的メッセージが飛ぶ OPが命令• クライアント→サーバ • サーバ→クライアント – PUB – MSG – SUB – OK – UNSUB – ERR – PING – PING – PONG – PONG – CONNECT – INFO – INFO – UNKNOWN – UNKNOWN• lib/nats/server/connection.r • lib/nats/client.rb 446行目~ b 57行目~ に受信処理 に受信処理
  23. 23. メッセージングの例 サンプルを動かす1 の場合Server Sub PubINFO => ** <= CONNECT* <= SUB fooINFO => ** <= CONNECT* <= PUB foo hello!MSG hello! => hello!
  24. 24. 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=“>”時のSublistNodestruct SublistNode :leaf_nodes NATSD::Subscriber の配列 :next_level SublistLevel
  25. 25. NATSのテスト• rspec• rspec/spec_helper.rb – NatsServerControl超便利
  26. 26. NATSの問題点• 現状single server• “cluster” blanchが存在• 設計方針 Cluster Design Overview https://github.com/derekcollison/nats/ wiki/Cluster-Design
  27. 27. なぜNATSなのか?• 他の案 – AMQP(RabbitMQ) – Storm – RestMS – XMPP• RubyWorld Conf. / Why ruby? – Allows great productivity and rapid iteration – Language perfomance is not always key
  28. 28. Cloud FoundryでのNATS (ちょっとだけ)
  29. 29. NATS Server(NATSD)の起動• @ bin/vcap`#{nats_server} –p #{@uri.port} –P #{@pid_file} –d 2> /dev/null`• 現状、全てのvcapサーバで nats serverが動作してしまう (本来 mbus:// で指定されるサーバ以外は不要)
  30. 30. 青い 矢印が NATSとCloud NATSの Foundry(2)メッセージ NATSが 落ちても Serviceは動くはず? Cloud Foundry The building of the Open PaaS OSCON2011 http://www.slideshare.net/derekcollison/oscon-2011
  31. 31. まとめ1. NATSはEventMachineを使ったPub/Sub メッセージングシステム2. コード量は小さめだし、 コード、テスト(spec)ともに丁寧なので Ruby初級者にもお勧め3. Cluster対応版はまだですか?
  32. 32. 質問タイム
  33. 33. サンプルを動かす4 authentication
  34. 34. サンプルを動かす5 reply
  35. 35. NATSの概要 他のPaaSでのmessagingの実装heroku 不明 RoutingはErlangベースの独自実装GAE 不明 RabbitMQのProjects involving RabbitMQに”App Engine imprementation”とあるが何に使ってい るかは不明AppScale 不明 未調査TyphoonAE• 情報お待ちしております<(_ _)>
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×