SpringCloud进阶RabbitMQ消息队列,如何实现高效处理?
摘要:RabbitMQ消息队列 什么是消息队列? 一般我们在进行远程调用时,可以使用发送HTTP请求来完成,现在可以使用第二种方式,那就是消息队列。 他能将发送方发送的消息放入队列中,当新消息入队时,会通知接收方进行处理,一般消息发送方称为生产者
RabbitMQ消息队列
什么是消息队列?
一般我们在进行远程调用时,可以使用发送HTTP请求来完成,现在可以使用第二种方式,那就是消息队列。
他能将发送方发送的消息放入队列中,当新消息入队时,会通知接收方进行处理,一般消息发送方称为生产者,接收方称为消费者。
这样所有的请求都直接丢到消息队列中,再由消费者取出,不再是直接连接消费者的形式了,而是增加了一个中间商,这也时一种很好的解耦方案,并且在高并发情况下,由于消费者能力有限,消息队列能起到削峰填谷的作用,堆积一部分请求,再由消费者来慢慢处理,而不会像直接调用那样请求蜂拥而至!
消息队列的具体实现有哪些?
RabbitMQ:老牌、稳定、功能全,适合传统企业、小中型项目、复杂路由
Kafka:吞吐量爆炸、高吞吐、日志 / 大数据专用,不适合做业务消息
RocketMQ:阿里出品,高吞吐 + 业务可靠,电商 / 金融 / 互联网主流
那到底要怎么选择呢?
做电商 / 订单 / 支付 → RocketMQ
做日志 / 大数据 / 流处理 → Kafka
做企业系统 / 微服务解耦 → RabbitMQ
整体对比如下:
对比维度
RabbitMQ
Kafka
RocketMQ
开发语言
Erlang
Scala/Java
Java
协议
AMQP、MQTT、STOMP
自定义 TCP 协议
自定义 TCP 协议
吞吐量
万级 TPS中等并发
几十万 TPS超高吞吐
十万级 TPS高吞吐
延迟
微秒级极低延迟
毫秒级
毫秒级
可靠性
高持久化 + 消息确认
中配置不当易丢消息
最高金融级可靠
功能丰富度
最全复杂路由、死信、优先级、延迟
极简只做发布订阅、流处理
很全事务、定时、重试、顺序消息
集群依赖
自带集群
依赖 Zookeeper
依赖 NameServer
运维难度
一般Erlang 问题难排查
较高依赖 ZK,参数多
较低轻量、易部署
社区生态
国外成熟、文档全
大数据生态极强
国内生态好、阿里系完善
典型场景
企业系统、微服务解耦、复杂路由
日志收集、大数据流、埋点
电商、金融、订单、秒杀、支付
安装消息队列
RabbitMQ运行需要Erlang环境,所以需要先安装Erlang环境
安装Erlang环境
sudo apt install erlang
安装RabbitMQ
sudo apt install rabbitmq-server
安装完成后可输入sudo rabbitmqctl status 查看当前RabbitMQ的运行状态
可以看到有两个端口,一会使用的就是amqp协议那个端口来连接。
25672时集群化端口。
开启RabbitMQ管理面板,这样就可以在浏览器上进行实时访问和监控了:
sudo rabbitmq-plugins enable rabbitmq_management
输入网址http://127.0.0.1:15672 就可以访问了
默认用户和密码都是guest,guest只能在本地进行登录,如果要从远程服务器访问管理面板,要创建一个新的管理员账号,不能使用guest。
创建命令如下 :
# sudo rabbitmqctl add_user 用户名 密码
sudo rabbitmqctl add_user admin admin
然后将管理员权限授予创建的用户
sudo rabbitmqctl set_user_tags admin administrator
然后就可以登录了。
RabbitMQ的设计架构如下:
Channel:客户端连接会使用Channel,再通过Channel访问Rabbit MQ服务器,这里的通信协议不是http,而是amqp协议。
Exchange:类似于交换机,会根据请求,转发给对应的消息队列,每个队列都可以绑定到Exchange上,这样Exchange就可以将数据转发给队列。可以存在多个。不同的Exchange类型可以用于实现不同的消息模式。
Queue:消息队列,生产者所有的消息都存放再消息队列中,等待消费者取出。
Virtual Host:类似于环境隔离,不同环境可以单独配置一个Virtual Host,每个Virtual Host可以包含多个Exchange和Queue,每个Virtual Host互不影响。
