1. 什么是MQ
MQ( Message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是消息(message)而已.消息可以非常简单,比如只包含文本字符串,JSON等,也可以很复杂,比如内嵌对象.MQ多用于分布式系统之间进行通信
系统之间的调用通常有两种方式: 一种是同步通信 另外一种是 异步通信
同步通信
同步通信就是直接调用对方的服务,数据从一端发出后立即就可以达到另一端。
异步通信
数据从一端发出后,先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端.容器的一个具体实现就是MQ(message queue)
而Rabbit是MQ的一种实现
2. MQ的作用
MQ主要工作是接收并转发消息,在不同的应用场景下可以展现不同的作用。
- 1.异步解耦: 在业务流程中,一些操作可能非常耗时,但并不需要即时返回结果,可以借助MO把这些操作异步化,比如 用户注册后发送注册短信或邮件通知,可以作为异步任务处理,而不必等待这些操作完成后才告知用户注册成功.
- 2.流量削峰: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见.如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费,使用MO能够使关键组件支撑突发访问压力,不会因为突发流量而崩溃,比如秒杀或者促销活动,可以使用MQ来控制流量,将请求排队,然后系统根据自己的处理能力逐步处理这些请求.
- 3.消息分发:当多个系统需要对同一数据做出响应时,可以使用MQ进行消息分发,比如支付成功后,支付系统可以向MQ发送消息,其他系统订阅该消息,而无需轮询数据库.
- 4.延迟通知: 在需要在特定时间后发送通知的场景中,可以使用MQ的延迟消息功能,比如在电子商务平台中,如果用户下单后一定时间内未支付,可以使用延迟队列在超时后自动取消订单
3. MQ产品对比
M的实现肯定不止RabbitMQ一种,在使用的时候可以根据自己的业务需求和使用场景来选择最适合自己的技术。
1. Kafka
Kafka一开始的目的就是用于日志收集和传输,追求高吞吐量,性能卓越,单机吞吐达到十万级,在日志领域比较成熟,功能较为简单,主要支持简单的 MQ 功能,如果有日志采集需求,肯定是首选kafka了。
2.RocketMQ
RocketMQ采用Java语言开发,由阿里巴巴开源,后捐赠给了Apache.它在设计时借鉴了Kafka,并做出了一些自己的改进,青出于蓝而胜于蓝,经过多年双十一的洗礼,在可用性、可靠性以及稳定性等方面都有出色的表现,适合对于可靠性比较高,且并发比较大的场景,比如互联网金融,但支持的客户端语言不多,且社区活跃度一般
3. RabbitMO
采用Erlang语言开发,MQ功能比较完备,且几乎支持所有主流语言,开源提供的界面也非常友好,性能较好,吞吐量能达到万级,社区活跃度也比较高,比较适合中小型公司,数据量没那么大,且并发没那么高的场景.
其实Rabbit的性能来说并算不上是顶尖的,但是其几乎支持所有语言,并且他有着很完善的社区,作为开发者在使用的过程中可以通过社区交流来解决自己使用技术的时候遇到的困难,这一点也是十分关键的。此外RabbitMQ的管理界面也是十分友好的.
4. RabbitMQ介绍
4.1 RabbitMQ安装(Ubuntu系统)
首先要在我们的服务器上安装erlang,毕竟Rabbit是使用Erlang来写的嘛,就像我们使用Java程序需要安装JDK是一样的道理。
#更新软件包
sudo apt-get update
#安装erlang
sudo apt-get install erlang
使用 erl 命令查看erlang版本,出现上面的信息后就可以进行RabbitMQ的安装了。
# 安装RabbitMQ
#更新软件包
sudo apt-get update
#安装rabbitmq
sudo apt-get install rabbitmq-server
#确认安装结果
systemctl status rabbitmq-server
完成安装后,使用查看RabbitMQ的安装状态:# systemctl status rabbitmq-server
# 安装RabbitMQ的管理界面:rabbitmq-plugins enable rabbitmq_management
4.2 启动服务并访问
# 启动服务
sudo service rabbitmq-server start
# 通过IP:port访问界面
4.3 添加管理员用户
操作RabbitMQ可以通过代码 或者界面 或者通过命令操作[rabbitmqctl] , 这里和我们熟悉的MySQL因为是挺像的。
# 添加用户admin 密码 password
# rabbitmqctl add_user ${账号} ${密码}
rabbitmqctl add_user admin admin
# 给用户添加权限
以下角色可选
RabbitMQ用户角色分为Administrator、Monitoring、Policymaker、Management、Impersonator、None共六种角色
1.Administrator 超级管理员,可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作
2.Monitoring监控者,可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmg节点的相关信息(进程数,内存使用情况,磁盘使用情况等)。
3.Policymaker 策略制定者,可登陆管理控制台(启用management plugin的情况下),同时可以对policy进行管理。但无法查看节点的相关信息.
4.Management 普通管理者,仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理.
5.lmpersonator模拟者,无法登录管理控制台。
6.None 其他用户,无法登陆管理控制台,通常就是普通的生产者和消费者
# 访问