最近在研究zeromq中間件,他是一個輕量級的消息中間件,傳說是世界上最快的消息中間件,爲什麼這麼說呢?
因爲一般的消息中間件都需要啓動消息服務器,但是zeromq這廝盡然沒有消息服務器,他壓根沒有消息中間件的架子,但是這並不能掩蓋他的強大。
通過和activemq,rabbitmq對比,顯然功能上沒有前兩者這麼強大,他不支持消息的持久化,但是有消息copy功能,他也不支持崩潰恢復,而且由於他太快了,可能客戶端還沒啓動,服務端的消息就已經發出去了,這個就容易丟消息了,但是zeromq自由他的辦法,就先說這麼多了。先來看看怎麼在python中引入這個強大的利器。
安裝過程中可能會讓你安裝一些依耐包,耐心安裝即可,可以用命令echo $?(中間有個空格)來查看返回結果,返回0則前一個命令執行完整。
1.去獲取一個源碼包:http://download.zeromq.org/,最好選一個2.1以上的版本,防止裝不了。
2.tar xvf zeromq-2.1.11.tar.gz --解壓tar包
3.cd zeromq-2.1.11
4../configure
5.make
6.sudo make install
7.sudo ldconfig
8.pip install pyzmq
安裝好了以後可以測一下
>>> python
>>> import zmq
>>> print "Current 0MQ version is "+zmq.zmq_version()
Current 0MQ version is2.1.11
測試成功,說明python引入zeromq成功了,下面我們可以測下怎麼傳遞消息的
hwserver.py
- #
- # Hello World server in Python
- # Binds REP socket to tcp://*:5555
- # Expects "Hello" from client, replies with "World"
- #
- import zmq
- import time
- context = zmq.Context()
- socket = context.socket(zmq.REP)
- socket.bind("tcp://*:5555")
- while True:
- # Wait for next request from client
- message = socket.recv()
- print "Received request: ", message
- # Do some 'work'
- time.sleep (1) # Do some 'work'
- # Send reply back to client
- socket.send("World")
hwclient.py
- #
- # Hello World client in Python
- # Connects REQ socket to tcp://localhost:5555
- # Sends "Hello" to server, expects "World" back
- #
- import zmq
- context = zmq.Context()
- # Socket to talk to server
- print "Connecting to hello world server..."
- socket = context.socket(zmq.REQ)
- socket.connect ("tcp://localhost:5555")
- # Do 10 requests, waiting each time for a response
- for request in range (1,10):
- print "Sending request ", request,"..."
- socket.send ("Hello")
- # Get the reply.
- message = socket.recv()
- print "Received reply ", request, "[", message, "]"
下面我們說說pub和sub模式。
zeromq中的pub和sub模式沒有什麼特別的
但是這個時候我們會有疑問了,沒有服務器,server(pub)端發送消息需要綁定ip和端口號。client(sub)端需要連接ip和端口號這樣才能訂閱到server端發送的主題。
這樣豈不是天下大亂,消息傳輸都中pub端豈不是透明瞭。在zmq中有個模式叫代理模式,其代碼特別簡單
- import zmq
- context = zmq.Context()
- frontend = context.socket(zmq.SUB)
- frontend.connect("tcp://192.168.55.210:5556")
- backend = context.socket(zmq.PUB)
- backend.bind("tcp://10.1.1.0:8100")
- frontend.setsockopt(zmq.SUBSCRIBE, '')
- while True:
- while True:
- message = frontend.recv()
- more = frontend.getsockopt(zmq.RCVMORE)
- if more:
- backend.send(message, zmq.SNDMORE)
- else:
- backend.send(message)
- break # Last message part
我們啓動一到兩個代理來負責幹其他消息中間件消息服務器乾的事(有點繞!)
就這樣在python中引入了zmq了,但是在一個分佈式的集羣環境下,一般軟件環境很難保持統一,那麼跨語言怎麼通信呢?請看下回分解。