一、简介:
RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信。而作为中间件的 RabbitMq 无疑是目前最流行的消息队列之一。
RabbitMq 应用场景广泛:
- 系统的高可用:日常生活当中各种商城秒杀,高流量,高并发的场景。当服务器接收到如此大量请求处理业务时,有宕机的风险。某些业务可能极其复杂,但这部分不是高时效性,不需要立即反馈给用户,我们可以将这部分处理请求抛给队列,让程序后置去处理,减轻服务器在高并发场景下的压力。
- 分布式系统,集成系统,子系统之间的对接,以及架构设计中常常需要考虑消息队列的应用。
二、使用docker安装部署rabbitmq
1、使用前置环境
(1)Linux系统
(2)已经安装好docker
2、查找镜像(有2种方式)
(1)登录rabbitmq官网找到docker镜像,选择想要的镜像的tag
https://www.rabbitmq.com/download.html
https://hub.docker.com/_/rabbitmq
注:如果需要访问web管理页面,就选择tag为management的。
注:带有alpine的是用最小linux镜像构建的,体积最小可以达5M初学者不建议这么折腾,而且 Alpine Linux使用了muslmusl实现的DNS服务不会使用resolv.conf文件中的search和domain两个配置,通过DNS来进行服务发现时需要注意。,带有-management的是带有web控制台
(2)直接用docker search 搜索带web管理页面的
[root@caicai ~]# docker search rabbitmq:management INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/macintoshplus/rabbitmq-management Based on rabbitmq:management whit python a... 6 [OK] docker.io docker.io/xiaochunping/rabbitmq xiaochunping/rabbitmq:management 2018-06-30 4 docker.io docker.io/transmitsms/rabbitmq-sharded Fork of rabbitmq:management with sharded_e... 0 docker.io docker.io/yunyan2140/rabbitmq docker pull rabbitmq:management 0 [root@caicai ~]#
3、下载镜像(有时候网络问题超时,多尝试几次即可。选择可以访问web管理界面的tag)
sudo docker pull rabbitmq:management
4、创建容器并运行
docker run -dit --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:managemen # 15672是管理界面的端口,5672是服务的端口。这里顺便将管理系统的用户名和密码设置为admin admin 默认账号和密码是guest guest
5、打开浏览器访问web界面
输入 http://IP地址:15672 账号密码admin
三、RabbitMq 生产和消费
生产者(producter):队列消息的产生者,负责生产消息,并将消息传入队列
# -*- coding:utf-8 -*- # @Time : 2020/9/7 14:43 # @Author: caijunchao # @File : producter.py import pika import json credentials = pika.PlainCredentials('guest', 'guest') # mq用户名和密码 # 虚拟队列需要指定参数 virtual_host,如果是默认的可以不填。 connection = pika.BlockingConnection(pika.ConnectionParameters(host = '121.40.35.209',port = 5672,virtual_host = '/',credentials = credentials)) channel=connection.channel() # 声明消息队列,消息将在这个队列传递,如不存在,则创建 result = channel.queue_declare(queue = 'python-test') for i in range(10): message=json.dumps({'OrderId':"1000%s"%i}) # 向队列插入数值 routing_key是队列名 channel.basic_publish(exchange = '',routing_key = 'python-test',body = message) print(message) connection.close()
消费者(consumer):队列消息的接收者,负责 接收并处理 消息队列中的消息
# -*- coding:utf-8 -*- # @Time : 2020/9/7 14:43 # @Author: caijunchao # @File : consumer.py import pika credentials = pika.PlainCredentials('guest', 'guest') connection = pika.BlockingConnection(pika.ConnectionParameters(host = '121.40.35.209',port = 5672,virtual_host = '/',credentials = credentials)) channel = connection.channel() # 申明消息队列,消息在这个队列传递,如果不存在,则创建队列 channel.queue_declare(queue = 'python-test', durable = False) # 定义一个回调函数来处理消息队列中的消息,这里是打印出来 def callback(ch, method, properties, body): ch.basic_ack(delivery_tag = method.delivery_tag) print(body.decode()) # 告诉rabbitmq,用callback来接收消息 channel.basic_consume('python-test',callback) # 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理 channel.start_consuming()
运行生产者代码,可以在web界面观察到任务列表
然后运行消费者代码,队列任务清空