在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了,但是在一个分布式的集群环境下,一般软件环境很难保持统一,那么跨语言怎么通信呢?请看下回分解。

 


 

你可能感兴趣的:(python)