1.2 MQ的工作原理
MQ的工作方式通常包含以下步骤:
· 消息生产: 生产者将消息发送到消息队列。
· 消息存储: 消息队列中间件接收并存储消息,直到有消费者来取走它们。
· 消息消费: 消费者从队列中取出消息并处理。
· 消息确认: 消费者处理完消息后,通常会向队列发送确认,通知中间件消息已成功处理,可以将其删除或标记为已处理。
1.3 MQ应用场景
1.3.1 异步处理
场景说明:用户注册后发送邮件和短信,假设每个步骤耗时100ms
·做法一:串行 300ms
将注册信息写入数据库后,发送邮箱,在发送短信,以上三个任务全部完成后才返回客户端。
· 做法二:并行 200ms
将注册信息写入数据库后,发送邮箱的同时发送短信,以上三个任务全部完成后才返回客户端。
·做法三:消息队列 100ms+写入消息队列时间
在将注册信息写入数据库后,立即返回客户端,显示注册成功。邮件和短信的发送可以异步处理,因为它们对网站的正常使用没有直接影响,客户端无需等待它们完成。
1.3.2 应用解耦
场景说明:用户下单后,订单系统需要通知库存系统
·做法一:接口直接调用
订单系统直接调用库存系统进行扣减,订单系统与库存系统强耦合,倘若库存系统出现故障或者性能瓶颈,会直接影响订单系统的使用。
·做法二:消息队列
用户下单后,将消息写入到消息队列,返回用户下单成功,库存订阅消息处理。
场景说明:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
1.4 常见的MQ
·ActiveMQ:Apache 软件基金会开发的 ActiveMQ 是一款广泛使用的消息中间件,支持多种协议。虽然其吞吐量有限,单机处理能力在万级左右,足以满足中小型项目的需求,但在大型互联网项目中可能会显得力不从心。
· Kafka: Kafka 主要用于实时数据流处理和大数据场景,擅长处理高吞吐量的消息。最初设计的目标是日志收集和传输。虽然不支持事务且对消息的重复、丢失或错误没有严格要求,但其在高吞吐量的应用场景中表现尤为出色。
· RocketMQ: RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。MQ的所有优点它基本都满足。但是它最大的缺点:商业版收费。因此它有许多功能是不对外提供的。
· RabbitMQ: 使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。在高可用上,它使用的是镜像集群模式,可以保证高可用。在消息可靠性上,它是可以保证数据不丢失的,这也是它的一大优点。同时它也支持一些消息中间件的高级功能,如:消息重试、死信队列等。
1.5 为什么选择RabbitMQ
· ActiveMQ,性能不是很友好
· Kafka,主要强调性能,可靠性差
· RocketMQ,MQ的所有优点它基本都满足。但是它最大的缺点:商业版收费。因此它有许多功能是不对外提供的。
2.RabbitMQ 介绍
2.1 简介
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。
特点:
· 基于AMQP协议来实现。主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。2.2 架构模型
模型常用概念详解:
·Producer:
生产者是消息的发送者。它将消息发送到 RabbitMQ 中,消息被发送到一个 Exchange(交换器)中。生产者并不知道消息将被发送到哪个队列(Queue),只负责将消息发送到指定的交换器。3.1 拉取镜像
$ docker pull docker.io/rabbitmq
3.2 运行容器
**运行脚本:**restart_service.sh
sedir=`pwd`datadir=$basedir/data
image=docker.io/rabbitmq
name=rabbitmq
mkdir-p$datadirdocker stop $name
dockerrm$namedocker run -d--name=$name--restart always -p5672:5672 -p15672:15672 -p15692:15692 -v$datadir:/var/lib/rabbitmq $image
运行:$ sh restart_service.sh
3.3 配置RabbitMQ
先进入容器内部:$dockerexec-it rabbitmq bash
3.3.1 启用网页版后台管理插件
$ rabbitmq-plugins enable rabbitmq_management
此时可以通过浏览器访问管理页面:http://ip地址:15672/
如果是腾讯云之类的话记得开放端口5672和15672
可以通过默认账号 guest/guest 登录
3.4 web管理界面详解
3.4.1 概览
3.4.2 Admin添加用户
Tags选项可以选择不同的角色来创建用户
· 超级管理员(administrator):可登录管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
新建用户xz
目前xz这个用户是没有虚拟机可以用的。接下来新建一个。
3.4.3 新建虚拟机
3.4.4 虚拟机绑定用户
3.4.5 切换到新建用户xz
解决方案开启 management_agent 插件
进入容器
$ dockerexec-it rabbitmq /bin/bash
$ cd /etc/rabbitmq/conf.d/
修改management_agent.disable_metrics_collector = false
$ echo management_agent.disable_metrics_collector =false>20-management_agent.disable_metrics_collector.conf重启容器
$ docker restart rabbitmq刷新可以看到更多页面数据了
切换对应目录
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址: