RocketMQ 入门
为什么使用消息中间件
异步:把非必要的业务逻辑以异步的方式运行,提高响应速度。
流量削峰:当并发量很大,比如每秒 5000,但是 MySQL 能处理的并发量可能只有 200,会导致系统崩溃。消费者系统按照数据库能处理的并发量从消息队列中拉取消息消费,这个短暂的高峰期积压是允许的。
解耦:如果 A 系统直接调用多个系统的接口,那修改其他系统需要修改 A 系统代码;如果 A 系统使用中间件来调用多个系统的接口,那么当其他系统修改时 A 系统不需要做任何修改。
为什么选择使用 RocketMQ
选择消息中间件我一般会用以下几个指标来考虑:功能支持、可靠性、性能、伸缩性等
ActiveMQ:目前社区活跃度较低,暂不考虑
RabbitMQ:虽然拥有灵活的路由配置,但是性能和吞吐量不是特别理想
Kafka:虽然拥有强大的性能以及吞吐量,但是批量发送,可能会导致延迟较高
RocketMQ:低延迟、吞吐量高、可靠性强,稳定性方面在阿里巴巴经历数次双十一考验,值得信赖。
什么情况下的异步操作需要使用消息队列而不是多线程
消息队列和多线程两者并不冲突,多线程可以作为队列的生产者和消费者。在使用外部的消息队列时,可以提高应用的稳定性,当程序宕机后,已经写入外部消息队列的数据依旧是保存下来的。
用线程的话,会占用主服务器资源;消息队列的话,可以放到其他机器上运行,让主服务器更纯粹地处理请求。如果用户不急着知道结果的操作,可以用消息队列,否则再考虑多线程。
消息队列是在架构层面解决问题;多线程是在编程语言层面解决问题;消息队列解耦更充分,架构更合理。
消息消费模型
消息消费模型一般有两种:
点对点模型:生产者往某个队列中发送消息,一个队列可以存储多个生产者的消息,一个队列也可以对应多个消费者,但是这些消费者是竞争关系,每条消息只能被一个消费者消费。
发布订阅模型:和队列模式最大的不同是,如果一个消息的主题被多个消费者同时订阅了,那么这些消费者都能收到这些消息的副本,不再是多个消费者竞争一个消息。
RocketMQ 的消息模型是标准的发布-订阅模型,在 RocketMQ 的术语表中,生产者、消费者和主题,与发布-订阅模型中的概念是完全一样的。
RocketMQ 优缺点
RocketMQ 优点:
- 可用性:搭建集群模式可以达到较高的可用性
- 消息可靠性:经过参数优化配置,消息可以做到0丢失
- 性能方面:支持10亿级别的消息堆积,不会因为堆积导致性能下降
- 稳定性:RoketMQ在稳定性上可能更值得信赖,在阿里双11已经经历了多次考验
RocketMQ缺点:
- 没有在 MQ 核心逻辑中去实现 JMS 等接口,有些系统要迁移需要修改大量代码
- 目前只支持 Java 和 C++,其中 C++ 客户端也不成熟
RocketMQ 角色介绍

NameServer
可以理解为是一个注册中心,支持 Broker 的动态注册与发现,提供给生产者和消费者查找 Broker 信息,从而进行消息的发送/消费。
Broker
主要负责消息的存储、投递以及服务高可用的保证,有以下子模块:
- Remoting Module:这是 Broker 的入口模块,负责处理所有来自客户端的请求。
- Client Manager:负责管理所有的生产者消费者客户端,并维护消费者和 Topic 的订阅信息。
- Store Service:提供把消息存储到物理磁盘和查询消息的功能。
- HA Service:高可用服务,提供 master 节点和 slave 节点之间的关系。
Producer
消息生产者,通过 NameServer 获取 Broker 的地址并发送消息。
Customer
消息消费者,支持 push、pull 两种模式对消息进行消费,同时也支持集群方式和广播形式的消费。
RocketMQ 术语介绍
Topic(主题)
用于标识一类消息。
Tag
同一类消息可以再细分二级分类,方便消费者进行消息的过滤。Topic:手机;Tag:苹果、小米、华为。
Group(分组)
一般生产者的分组主要作用于事务消息,因为 RocketMQ 有事务回查机制,当一个生产者挂了,事务回查的时候还可以找到同一个组内的其他生产者实例进行事务回查。体现了 RocketMQ 高可用的特性。
一个消费者组中的多个消费者只能订阅一类消息,消费进度与消费者组关联,体现了 RocketMQ 具有负载均衡的特性。如果多个消费者组订阅同一类消息,那么两组的消费是互不影响的。
Message Queue(消息队列)
用于传递消息的组件,一个 Queue 只能被一个消费者消费,但是一个消费者可以消费多个 Queue 的消息。如果消费者组中的消费者数量与 Queue 数量相同,那么一般来说会一个消费者对应消费一个 Queue,因为消费者有自己的业务逻辑,往往没有生产者生产消息快,使用 Queue 后可以实现多个消费者消费一个生产者生产的消息,体现了 RocketMQ 高性能的特性。
Offset(偏移量)
一般是指某一个队列中消费者消费的偏移量,可以简单理解成消费者消费了多少个消息。
另外还有队列中消息的偏移量,可以简单理解成队列中存储了多少消息。
RocketMQ 消息消费模式
clustering(集群):集群消费模式是消息会被雨露均沾地投递到消费者组内的各个消费者实例,消费进度保存在 Queue 中。这是默认并且常用的消费模式,后续如果没有特地说明是广播消费模式都认为是集群消费模式。
broadcast(广播):广播消费模式是消息会被投递到消费者组内的每一个消费者实例,相当于这些消费者实例都获取到这些消息的副本,所以消费进度由消费者自己维护。一般开发较为少数情况用到它,不太灵活。