在python中引入zeromq消息中間件環境

最近在研究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

Python代碼  
  1. #  
  2. #   Hello World server in Python  
  3. #   Binds REP socket to tcp://*:5555  
  4. #   Expects "Hello" from client, replies with "World"  
  5. #  
  6. import zmq  
  7. import time  
  8.   
  9. context = zmq.Context()  
  10. socket = context.socket(zmq.REP)  
  11. socket.bind("tcp://*:5555")  
  12.   
  13. while True:  
  14.     #  Wait for next request from client  
  15.     message = socket.recv()  
  16.     print "Received request: ", message  
  17.   
  18.     #  Do some 'work'  
  19.     time.sleep (1)        #   Do some 'work'  
  20.   
  21.     #  Send reply back to client  
  22.     socket.send("World")  

hwclient.py

Python代碼  收藏代碼
  1. #  
  2. #   Hello World client in Python  
  3. #   Connects REQ socket to tcp://localhost:5555  
  4. #   Sends "Hello" to server, expects "World" back  
  5. #  
  6. import zmq  
  7.   
  8. context = zmq.Context()  
  9.   
  10. #  Socket to talk to server  
  11. print "Connecting to hello world server..."  
  12. socket = context.socket(zmq.REQ)  
  13. socket.connect ("tcp://localhost:5555")  
  14.   
  15. #  Do 10 requests, waiting each time for a response  
  16. for request in range (1,10):  
  17.     print "Sending request ", request,"..."  
  18.     socket.send ("Hello")  
  19.       
  20.     #  Get the reply.  
  21.     message = socket.recv()  
  22.     print "Received reply ", request, "[", message, "]"  
 啓動server和client你會發現兩邊都在傳送消息,這是zmq中的應答模式,類似於請求響應模式。

下面我們說說pub和sub模式。

zeromq中的pub和sub模式沒有什麼特別的

但是這個時候我們會有疑問了,沒有服務器,server(pub)端發送消息需要綁定ip和端口號。client(sub)端需要連接ip和端口號這樣才能訂閱到server端發送的主題。

這樣豈不是天下大亂,消息傳輸都中pub端豈不是透明瞭。在zmq中有個模式叫代理模式,其代碼特別簡單

Python代碼  收藏代碼
  1. import zmq  
  2.   
  3. context = zmq.Context()  
  4.   
  5. frontend = context.socket(zmq.SUB)  
  6. frontend.connect("tcp://192.168.55.210:5556")  
  7.   
  8. backend = context.socket(zmq.PUB)  
  9. backend.bind("tcp://10.1.1.0:8100")  
  10.   
  11. frontend.setsockopt(zmq.SUBSCRIBE, '')  
  12.   
  13. while True:  
  14.     while True:  
  15.         message = frontend.recv()  
  16.         more = frontend.getsockopt(zmq.RCVMORE)  
  17.         if more:  
  18.             backend.send(message, zmq.SNDMORE)  
  19.         else:  
  20.             backend.send(message)  
  21.             break # Last message part 
這裏啓動一個代理端,負責接受消息以及分發消息,有沒有消息服務器的感覺,這下子世界清靜了。。

我們啓動一到兩個代理來負責幹其他消息中間件消息服務器乾的事(有點繞!)

就這樣在python中引入了zmq了,但是在一個分佈式的集羣環境下,一般軟件環境很難保持統一,那麼跨語言怎麼通信呢?請看下回分解。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章