介绍

RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, RabbitMQ 就是一个邮筒, 同时也是邮局和邮递员 . 
和邮局的主要不同点在于RabbitMQ不处理纸质信件, 而是 接收(accepts), 存储(stores) 和转发(forwards)二进制数据块 —— 消息(messages). 
在RabbitMQ中有一些自己的行业术语要了解 . 
生产(producing)在这里的意思就是发送(sending). 一个发送消息的程序就是生产者( producer) : 
 
队列(queue) 可以看做是邮筒的别名 ,它存在于RabbitMQ中. 虽然消息在RabbitMQ和你的应用程序中流转, 但它只能被存储在队列当中. 一个队列只受到主机的内存和磁盘的限制, 它实际上是个大的消息缓冲区. 许多生产者可以发送消息到一个队列, 许多消费者可以从队列中接收数据. 下面是队列的示意图: 
 
消费(consuming) 与接收(receiving)有相似的含义. 消费者(consumer)就是等待接收消息的程序 : 
 
要注意的是 生产者, 消费者, 和中间人不必在相同的主机上,实际上大多数情况下它们都不在同一台主机上 
(using the pika 0.10.0 Python client)

在教程的这部分里我们用Python写两个小程序; 一个 发送消息的生产者 (sender), 一个接收消息并把它打印出来的消费者consumer (receiver)

在下面的图例中, “P” 代表我们的生产者 , “C”代表我们的消费者. 中间的盒子是一个队列—由RabbitMQ 维持的消息缓冲区.

我们的整体设计大致如下图所示: 
 
生产者发送消息到名为 “hello”的 队列. 消费者从那个队列中接收消息

RabbitMQ 库

RabbitMQ遵循 AMQP 0.9.1, 这是一个开源的, 多用途(general-purpose)的消息发送协议. 
针对RabbitMQ,在不同语言中有多种客户端可用. 在本教程系列中我们将使用 Pika, 这是由RabbitMQ团队推荐的 Python客户端. 你可以使用pip安装.

发送 
 
我们的第一个程序send.py 将会发送一条消息到队列中. 我们要做的第一件事是和 RabbitMQ 服务建立连接.

#!/usr/bin/env python
import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
  • 1
  • 2
  • 3
  • 4
  • 5

现在我们已经建立了一个到本地机器的中间人(broker)的连接, 如果想要连接到不同的机器上的中间人,只要把‘localhost’替换成指定的名字和IP地址即可.

下一步, 在发送前我们要确保接收的队列存在. 如果我们发送消息到一个不存在的地址, RabbitMQ 会把消息丢弃掉. 我们创建一个名为‘hello’的队列 ,把消息发送到这个队列中:

channel.queue_declare(queue='hello')
  • 1

到这里我们准备好要发送消息了,第一条消息只是一个简单的字符串“hello world!”,把它发送到队列中

In RabbitMQ 一条消息从不会被直接发送到队列, 它会先经过一个交换所(exchange). 但我我们不要被细节缠住 ‒ 你会在教程的第三部分了解更多关于交换所的内容. 目前我们需要知道的就是如何使用有空字符串所指定的默认交换所。这个交换所允许我们准确指定消息应该前往哪个队列。 队列名由 “routing_key”参数指定:

channel.basic_publish(exchange='',routing_key='hello',body='Hello World!')
print(" [x] Sent 'Hello World!'")
  • 1
  • 2
  • 3
  • 4

退出程序前我们需要确保网络缓冲区(network buffers)被冲刷(flushed),并且我们的消息真的被发送到了RabbitMQ. 这只需要通过关闭连接来完成:

connection.close()
  • 1

接收 
 
我们的第二个程序 receive.py 将会从队列接收消息并且打印出来。

同样,我们首先要连接到RabbitMQ 服务。 连接到Rabbit的代码同前面的一样 。

下一步,同先前一样,要确保队列存在. 使用queue_declare 创建队列是一个幂等(idempotent)操作 ‒ 我们想运行多少次这个命令都可以, 但只有一个队列被创建.

channel.queue_declare(queue='hello')
  • 1

你可能会问为什么又一次声明队列 ‒ 我们在前面的代码中已经声明过一次. 如果我们确定队列存在的话的话可以避免那么做. 例如 send.py 已经运行了. 但我们不确定哪个程序先运行. 在这种情况下最好在两个程序中都声明一下,这是一个好的习惯。

列出所有队列

如果你想查看RabbitMQ 拥有哪些队列,有多少消息在其中.你可以使用 rabbitmqctl 工具:

sudo rabbitmqctl list_queues 
在 Windows中:

rabbitmqctl.bat list_queues

从队列中接收消息会稍微复杂一些. 通过给队列提供一个callback 函数来实现. 无论何时接收到消息, 这个callback 函数都会被 Pika 库调用. 在我们这里,这个函数会打印出接收到的消息.

def callback(ch, method, properties, body):print(" [x] Received %r" % body)
  • 1
  • 2

下一步, 我们需要告诉 RabbitMQ 这个callback函数应该从我们的 “hello”队列中接收消息:

channel.basic_consume(callback,queue='hello',no_ack=True)
  • 1
  • 2
  • 3

这里的“no_ack ”参数会在后面有介绍.

最后我们加一个等待接收数据并且在必要时运行回调函数的永远不会终止的循环.

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
  • 1
  • 2

整合 
send.py的完整代码:

#!/usr/bin/env python
import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()channel.queue_declare(queue='hello')channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") connection.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

receive.py的完整代码:

#!/usr/bin/env python
import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()channel.queue_declare(queue='hello')def callback(ch, method, properties, body): print(" [x] Received %r" % body) channel.basic_consume(callback, queue='hello', no_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

现在在终端运行我们的程序. 首先,启动一个消费者程序, 这会持续运行来等待接收消息:

python receive.py
  • 1

下面是在我的Ubuntu终端上的运行结果: 
 
现在来启动生产者. 生产者程序在运行完会退出:

python send.py
  • 1

在回头看之前打开的消费者程序终端,已经接到了消息: 

我们已经学会了如何向一个命名队列中发送和接收消息. 下一节我们来构建一个简单的工作队列(work queue)

转载于:https://www.cnblogs.com/ExMan/p/10281517.html

基于Python语言使用RabbitMQ消息队列(一)相关推荐

  1. 基于Python语言使用RabbitMQ消息队列(三)

    发布/订阅 前面的教程中我们已经创建了一个工作队列.在一个工作队列背后的假设是每个任务恰好会传递给一个工人.在这一部分里我们会做一些完全不同的东西--我们会发送消息给多个消费者.这就是所谓的" ...

  2. 基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战

    基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战 参考文章: (1)基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战 (2)https:// ...

  3. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  4. 消息队列——RabbitMQ消息队列集群

    RabbitMQ消息队列集群 消息队列/中间件 RabbitMQ详解 RabbitMQ单机部署 RabbitMQ集群部署 消息队列/中间件 一.前言 在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中 ...

  5. 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列

    QuartZ定时任务+RabbitMQ消息队列 一 .QuartZ定时任务解决订单系统遗留问题 情景分析: 在电商项目中 , 订单生成后 , 数据库商品数量-1 , 但是用户迟迟不进行支付操作 , 这 ...

  6. 初探 RabbitMQ 消息队列

    初探 RabbitMQ 消息队列 rabbitmq基础概念常见应用场景导入依赖属性配置具体编码定义队列实体类控制器消息消费者主函数测试总结说点什么 SpringBoot 是为了简化 Spring 应用 ...

  7. RabbitMQ消息队列常见面试题总结

    1.什么是消息队列: 1.1.消息队列的优点: (1)解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的.消息 ...

  8. RabbitMQ消息队列(一)《Java-2021面试谈资系列》

    RabbitMQ RabbitMQ消息队列 一.中间件 1.什么是中间件 2.中间件技术及架构概述 3.消息中间件 1.消息中间件的分布式架构 2.消息中间件使用场景 3.常见的消息中间件 4.消息中 ...

  9. RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

最新文章

  1. iis无法启动计算机上的服务器,Win7系统iis无法启动怎么解决?
  2. DDoS攻击愈演愈烈,反射攻击举足轻重
  3. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - A. 奖券数目
  4. Java面向对象(15)--static关键字静态理解与使用
  5. 我,23 岁 深漂女 Python自动化测试的心路历程|2021 总结
  6. Hosts文件与钓鱼网站
  7. 矩孔菲涅尔衍射 matlab,圆孔矩孔的菲涅尔衍射模拟(matlab实现)-工程光学.docx
  8. 圆柱螺旋压缩弹簧计算实例
  9. c++源码逆向UML工具踩坑
  10. RuntimeError: Error compiling objects for extension 和nvcc fatal : Unsupported gpu architecture ‘c
  11. 【面试必过系列,15个经典面试问题及回答思路
  12. Mac 如何删除应用、软件
  13. 目前最好的python教程_目和毫米的换算
  14. 碳纤维复合材料加固钢筋混凝土的极化作用
  15. 安化云台山风景区三个景点,轻松游玩山水之间的风光
  16. python中,@和- 代表什么?
  17. 【Linux学习-入门推荐】
  18. JAVA面经复习(二十六)面试难度:☆☆☆☆
  19. android面试题-人事面试宝典二
  20. 基于WIN32汇编实现的仿Windows计算器

热门文章

  1. Skyscrapers (easy version)CodeForces - 1313C1(暴力)
  2. 蓝桥杯 乘积最大(区间dp+记忆化搜索)
  3. 虚拟服务器 cms安装,轻量化云服务器怎么安装cms
  4. Android自定义文件路径箭头,Android自定义ViewGroup实现带箭头的圆角矩形菜单
  5. mysql 5.6.16 log_mysql-5.6.16装配脚本
  6. 一个按键控制数码管的开和关_一个按键控制一个数码管
  7. 安徽工程大学计算机控制,(完整版)安徽工程大学期末考试《计算机控制技术》范围总结2 .pdf...
  8. 【计算机组成原理】存储器简述
  9. 西门子smartclient怎么用_西门子官方应用Sm@rtClient Lite APP
  10. 【实例分割_SOLOv2】SOLOv2:Dynamic,Faster and Stronger