本文已参与「新人创作礼」活动,一起开启掘金创作之路。
RabbitMQ简介
定义
RabbitMQ是MQ中的一种,MQ(message queue)就是程序员口中常说的消息队列。它在服务与服务的调用过程中加了一层,将原本服务A调用服务B变成服务A将请求打到MQ,服务B自己去MQ拿请求处理(如下图) 。
优缺点
通过生活中的案例来描述mq的优缺点。其中快递小哥是服务A,丰巢就是MQ,收件人是服务B。下面我们假设快递小哥送快递是发送请求,收件人收到快递为响应完成。
优点
- 解耦(提高系统容错率及可维护性) 没有丰巢的情况下,快递小哥尽管打电话通知收件人来取货,最终的快递派送时长取决于收件人(即服务B)。当快递小哥有很多快递要送时(服务A很多请求),却有些收件人因为加班等原因拿不了快件(不能响应服务A的请求),导致了快递派送失败(请求未被响应,造成服务A的不可用)。 引入丰巢后,不管收件人在哪里,快递小哥只要把快递都放丰巢中就完成了任务,这就实现了快递小哥与收件人的解耦
- 异步(提升用户体验及吞吐量) 没有丰巢的情况下,收件人3因为加班,要快递小哥等二十分钟,那么快递小哥能做的就是等一等,这就会消耗小哥的20分钟时间。 引入丰巢后,快递小哥把东西放丰巢就可以回家了,收件人3可以回来后在取,这就实现了异步,大大提高程序的效率
- 削峰填谷(提高系统稳定性) 双十一收件人很多快递同时到了,双十一快递小哥很忙,没时间等。 京东小哥:你马上来A地点那个快递,过时不候,我还有其他快递要送 顺丰小哥:你马上来B地点那个快递,过时不候,我还有其他快递要送 天猫小哥:你马上来C地点那个快递,过时不候,我还有其他快递要送 中通小哥:你马上来D地点那个快递,过时不候,我还有其他快递要送 。。。 这个时候对于收件人来说就很难了,取那个都不对,总有快递拿不到。引入丰巢后,小哥们直接吧快递都放快递柜,收件人一次取一点就可以解决问题。这就是削峰填谷。
缺点
- 系统可用性降低 MQ挂掉,全部玩完,丰巢故障门都打不开,所有人都取不了快递。
- 消息丢失 同步调用转异步调用,消息处理失败如何补偿
常见概念
- broker:接收和发送消息的应用
- virtual host:可以理解为MySQL中的数据库,想要操作需要赋予对应的权限,基于多租户与安全考虑的。一个broker可以创建多个v host
- Connection:pushlisher/consumer 和broker建立的TCP连接
- channel:channel是connection内建立的逻辑连接,可以建立多个。mq会接收很多请求,一个请求使用一个connection显然是不合理的,因此有了channel,多线程情况下,每个线程的channel是完全隔离的。channel通过AMQP method能够识别channel id的能力,可以很轻松的被客户端与broker识别
- Exchange:消息最早进入的一个组件,根据分发规则,查询表中对应的routing key,将消息推送到queue中去。常见类型有direct点对点,topic发布订阅
- queue:队列
- binding:exchange与queue之间的桥梁,binding中可以包含routing key。binding信息被保存到exchange中的表中,用于消息的分发
RabbitMQ安装
软件准备
百度网盘:Linux安装包地址
安装二郎神
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
安装RabbitMQ
rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm -force -nodeps
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm -force -nodeps
开启管理页面,配置默认用户
# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
启动RabbitMQ
启动服务后,浏览器输入ip+端口号就可以看到如下页面了。
service rabbitmq-server start # 启动服务
service rabbitmq-server stop # 停止服务
service rabbitmq-server restart # 重启服务
注意事项
cd /usr/share/doc/rabbitmq-server-3.6.5/
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
如果web控制台无法正常访问考虑安装是否成功以及是防火墙的原因
关闭防火墙命令:systemctl stop firewalld
ecs放开15672端口