Python: ZeroMQ
基本
メッセージパッシングフレームワーク or メッセージキューフレームワークの一種.
これらはOSSでいっぱいあり,メッセージブローカーがあるbrokerd, メッセージブローカーがいないbrokerlessに大まかに分類される.ZeroMQはbrokerlessに分類される.アーキテクチャとして,brokerdにすることも可能.
Middlewareというよりは,単なるのsocket abstraction libraryとして捉えたほうがいい.
- Docは,ここ
- まず,どんなパターンがあるか,Messaging-Patternsを読んで,図を眺めるのがいいと思う.
- サンプルコードは
何ができるか
- 分散P2P
- HA (耐障害性)に関しては,high-level featureとしてあるというよりは
- brokerdのBinary Star Pattern
- broker-lessのFreelance-Pattern
で自分で保証して,という感じ.サンプルコード用意している.
Messaging Pattern
- PUB and SUB
- REQ and REP
- REQ and ROUTER (take care, REQ inserts an extra null frame)
- DEALER and REP (take care, REP assumes a null frame)
- DEALER and ROUTER
- DEALER and DEALER
- ROUTER and ROUTER
- PUSH and PULL
- PAIR and PAIR
はできる.
XPUB, XSUB (pub, subのraw version)は参照するが,これら以外の組み合わせは,ドキュメンテーションしていないし,信頼できないと言っている.
各役割に関しては,これが詳しい.
他人のGetting Started
自分でまとめるより,下記
- http://blog.wktk.co.jp/archives/71
- http://blog.pythonisito.com/2012/08/distributed-systems-with-zeromq.html
がまずはとっつきやすい.
公式 Getting Started
http://zguide.zeromq.org/page:all#Chapter-Basicsにサンプルコードのリンクがたくさんあるので,Docを見ながら,コードみるのが良い.
Mycode Samples
以下の3パターンのサンプルが,ここ
REQ/RES: server/client (server-client blocking, a client can connect to many servers)
PUB/SUB: broadcast (non reliable publish)
PUSH/PULL: loadbalancing
気をつける点
- network周りのI/Oはbackground threadで行われる,mesageはinput queueに入って,output queueから出て行く
- 基本は1 threadだけど,増やすことも可能. contextに対して増やす操作をする
- 1秒あたり,1 GBのin or out dataあたり,1 threadを目安に考える
- socket.bind()が何回も可能.ただし同じアドレス:ポートの組み合わせはだめ
- 同じsocketをmultithread間で使わない
- 1thread or 1proceessで複数socketsを扱う場合はpollを使う
参考
- http://zeromq.org/
- http://zguide.zeromq.org/page:all
- http://zeromq.org/intro:read-the-manual
- http://postd.cc/dissecting-message-queues/
- http://blog.wktk.co.jp/archives/71
- http://blog.pythonisito.com/2012/08/distributed-systems-with-zeromq.html
- https://github.com/imatix/zguide/tree/master/examples/Python
- http://pyzmq.readthedocs.org/en/latest/api/
- http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/pyzmq.html
- http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/patterns.html