RabbitMQ简介
RabbitMQ官方中文文档
RabbitMQ能为你做些什么?
消息系统允许软件、应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶.
或许你正在考虑进行数据投递,非阻塞操作或推送通知。或许你想要实现发布/订阅,异步处理,或者工作队列。所有这些都可以通过消息系统实现。
RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
rabbitmq技术亮点
- 可靠性:提供了多种技术让你在性能和可靠性之间进行权衡。
- 灵活的路由:消息在到达队列之前,是通过交换机进行路由的。rabbitmq提供了多种内置交换机类型,可将多个交换机组合起来使用。
- 集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用。
- 联合:对于服务器来说,它比集群需要更多的松散和非可靠链接。为此RabbitMQ提供了联合模型。
- 高可用的队列:在同一个集群里,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障后,你的消息仍然安全。
- 多协议:RabbitMQ 支持多种消息协议的消息传递。
- 广泛的客户端:只要是你能想到的编程语言几乎都有与其相适配的RabbitMQ客户端。
- 可视化管理工具:RabbitMQ附带了一个易于使用的可视化管理工具,它可以帮助你监控消息代理的每一个环节。
- 追踪:如果你的消息系统有异常行为,RabbitMQ还提供了追踪的支持,让你能够发现问题所在。
- 插件系统:RabbitMQ附带了各种各样的插件来对自己进行扩展。你甚至也可以写自己的插件来使用。
RabbitMQ安装
我们在ubuntu上安装rabbitmq
# 安装rabbitmq服务
sudo apt install rabbitmq-server
sender1.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 # -*- coding:utf-8 -*- 2 # @Author:Liu Guoyang 3 # @Time :2019/8/7 21:14 4 # @File :sender1.py 5 6 7 import pika 8 9 credentials = pika.PlainCredentials('alex', 'alex123') # 服务端创建的用户名和密码 10 connection = pika.BlockingConnection(pika.ConnectionParameters(host="192.168.150.135", credentials=credentials)) 11 # 建立了rabbit协议的通道 12 channel = connection.channel() 13 14 # 声明一个queue 15 channel.queue_declare(queue='hello') 16 17 # 发消息 18 channel.basic_publish( 19 exchange='', 20 routing_key='hello', # 把消息发给名称为hello的队列 21 body='Hello World!' # 发消息到队列,消息的内容 22 ) 23 24 print("[x] Sent 'Hello World!'") 25 connection.close()
receive1.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 # -*- coding:utf-8 -*- 2 # @Author:Liu Guoyang 3 # @Time :2019/8/7 23:43 4 # @File :receive1.py 5 6 import pika 7 import time 8 9 credentials = pika.PlainCredentials('alex', 'alex123') 10 connection = pika.BlockingConnection(pika.ConnectionParameters( 11 '192.168.150.135', credentials=credentials)) 12 13 channel = connection.channel() 14 15 # You may ask why we declare the queue again ‒ we have already declared it in our previous code. 16 # We could avoid that if we were sure that the queue already exists. For example if send.py program 17 # was run before. But we're not yet sure which program to run first. In such cases it's a good 18 # practice to repeat declaring the queue in both programs. 19 channel.queue_declare(queue='hello') 20 21 22 def callback(ch, method, properties, body): 23 print(" [x] Received %r" % body) 24 25 26 channel.basic_consume('hello', callback, False) 27 28 print(' [*] Waiting for messages. To exit press CTRL+C') 29 channel.start_consuming()