Python操作RabbitMQ服务器实现消息队列的路由功能


Posted in Python onJune 29, 2016

Python使用Pika库(安装:sudo pip install pika)可以操作RabbitMQ消息队列服务器(安装:sudo apt-get install rabbitmq-server),这里我们来看一下MQ相关的路由功能。

路由键的实现

比如有一个需要给所有接收端发送消息的场景,但是如果需要自由定制,有的消息发给其中一些接收端,有些消息发送给另外一些接收端,要怎么办呢?这种情况下就要用到路由键了。

路由键的工作原理:每个接收端的消息队列在绑定交换机的时候,可以设定相应的路由键。发送端通过交换机发送信息时,可以指明路由键 ,交换机会根据路由键把消息发送到相应的消息队列,这样接收端就能接收到消息了。

这边继上一篇,还是用send.py和receive.py来模拟实现路由键的功能。send.py表示发送端,receive.py表示接收端。实例的功能就是将info、warning、error三种级别的信息发送到不同的接收端。

send.py代码分析

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为direct
channel.exchange_declare(exchange='messages', type='direct')
 
#定义三个路由键
routings = ['info', 'warning', 'error']
 
#将消息依次发送到交换机,并设置路由键
for routing in routings:
  message = '%s message.' % routing
  channel.basic_publish(exchange='messages',
             routing_key=routing,
             body=message)
  print message
 
connection.close()

receive.py代码分析

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为direct
channel.exchange_declare(exchange='messages', type='direct')
 
#从命令行获取路由键参数,如果没有,则设置为info
routings = sys.argv[1:]
if not routings:
  routings = ['info']
 
#生成临时队列,并绑定到交换机上,设置路由键
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
for routing in routings:
  channel.queue_bind(exchange='messages',
            queue=queue_name,
            routing_key=routing)
 
def callback(ch, method, properties, body):
  print " [x] Received %r" % (body,)
 
channel.basic_consume(callback, queue=queue_name, no_ack=True)
 
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()

打开两个终端,一个运行代码python receive.py info warning,表示只接收info和warning的消息。另外一个终端运行send.py,可以观察到接收终端只接收到了info和warning的消息。如果打开多个终端运行receive.py,并传入不同的路由键参数,可以看到更明显的效果。

当接收端正在运行时,可以使用rabbitmqctl list_bindings来查看绑定情况。

路由键模糊匹配
路由键模糊匹配,就是可以使用正则表达式,和常用的正则表示式不同,这里的话“#”表示所有、全部的意思;“*”只匹配到一个词。看完示例就能明白了。

这边继上面的例子,还是用send.py和receive.py来实现路由键模糊匹配的功能。send.py表示发送端,receive.py表示接收端。实例的功能大概是这样:比如你有个知心好朋友,不管开心、伤心、工作上的还是生活上的事情都可以和她说;还有一些朋友可以分享开心的事情;还有一些朋友,你可以把不开心的事情和她说。

send.py代码分析

因为要进行路由键模糊匹配,所以交换机的类型要设置为topic,设置为topic,就可以使用#,*的匹配符号了。

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为topic
channel.exchange_declare(exchange='messages', type='topic')
 
#定义路由键
routings = ['happy.work', 'happy.life', 'sad.work', 'sad.life']
 
#将消息依次发送到交换机,并设定路由键
for routing in routings:
  message = '%s message.' % routing
  channel.basic_publish(exchange='messages',
             routing_key=routing,
             body=message)
  print message
 
connection.close()

上例中定义了四种类型的消息,容易理解,就不解释了,然后依次发送出去。

receive.py代码分析

同样,交换机的类型要设定为topic就可以了。从命令行接收参数的功能稍微调整了一下,就是没有参数时报错退出。

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为topic
channel.exchange_declare(exchange='messages', type='topic')
 
#从命令行获取路由参数,如果没有,则报错退出
routings = sys.argv[1:]
if not routings:
  print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)
  exit()
 
#生成临时队列,并绑定到交换机上,设置路由键
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
for routing in routings:
  channel.queue_bind(exchange='messages',
            queue=queue_name,
            routing_key=routing)
 
def callback(ch, method, properties, body):
  print " [x] Received %r" % (body,)
 
channel.basic_consume(callback, queue=queue_name, no_ack=True)
 
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()

打开四个终端,一个运行如下,表示任何事情都可以和她说:

python receive.py "#"

另外一个终端 运行如下,表示可以和她分享开心的事:

python receive.py "happy.*"

第三个运行如下,表示工作上的事情可以和她分享:

python receive.py "*.work"

最后一个运行python send.py。结果不难想象出来,就不贴出来了。

Python 相关文章推荐
Python学习笔记之os模块使用总结
Nov 03 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
python scrapy爬虫代码及填坑
Aug 12 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
pytorch打印网络结构的实例
Aug 19 Python
python如何保证输入键入数字的方法
Aug 23 Python
Python进度条的制作代码实例
Aug 31 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 #Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 #Python
Python的消息队列包SnakeMQ使用初探
Jun 29 #Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 #Python
深入理解Python中装饰器的用法
Jun 28 #Python
Python中的迭代器与生成器高级用法解析
Jun 28 #Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 #Python
You might like
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
brook javascript框架介绍
2011/10/10 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
用Python shell简化开发
2018/08/08 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
行政助理岗位职责范文
2013/12/03 职场文书
影视制作岗位职责
2013/12/04 职场文书
公司委托书格式范文
2014/10/09 职场文书
司机岗位职责范本
2015/04/10 职场文书
2015年化验室工作总结
2015/04/23 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python