介绍
RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。
MQ应用场景
老生常谈,MQ想必在大家的工作当中或多或少的都会使用到,我们一般会用MQ解决一下午一些场景:
- 削峰填谷:诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲,或因没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,消息队列RocketMQ可提供削峰填谷的服务来解决该问题。
- 异步解耦:交易系统作为淘宝和天猫主站最核心的系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,消息队列RocketMQ可实现异步通信和应用解耦,确保主站业务的连续性。
- 顺序收发:细数日常中需要保证顺序的应用场景非常多,例如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等等。与先进先出FIFO(First In First Out)原理类似,消息队列RocketMQ提供的顺序消息即保证消息FIFO。
- 分布式事务一致性:交易系统、支付红包等场景需要确保数据的最终一致性,大量引入消息队列RocketMQ的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。
- 大数据分析:数据在“流动”中产生价值,传统数据分析大多是基于批量计算模型,而无法做到实时的数据分析,利用阿里云消息队列RocketMQ与流式计算引擎相结合,可以很方便的实现业务数据的实时分析。
- 分布式缓存同步:天猫双11大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因带宽瓶颈,限制了商品变更的访问流量,通过消息队列RocketMQ构建分布式缓存,实时通知商品数据的变化。
RocketMQ生产消费模型
RocketMQ的生产消费模型如上图,与大多数中间件一样,采用发布订阅模式,包含生产者、消费者、以及包括服务端,RocketMQ主要支持以下功能
- 顺序消费:消费者按照消息到达消息服务器的顺序消费,RcoketMQ保证消息严格有序
- 消息过滤:消费者针对同一主题下的消息按照规则只消费自己感兴趣的消息,消息过滤需要服务端和客户端的共同参与
- 消息存储:RocketMQ为了追求消息存储的高性能,引入了内存映射机制,所有的消息按照顺序的存储在同一个文件当中,为了避免消息无限制的存储,还引入了消息文件过期机器预计存储空间告警
- 消息高可用:RocketMQ支持同步涮盘和异步刷盘,同步刷盘可以保证除了硬件故障外,其他场景不丢失数据;异步刷盘在异常场景会丢失少量消息
- 消息保证最少消费一次:通过消费确认机制确保消息至少被消费一次,不过ack消息可能存在丢失的请求,因此RocketMQ无法保证消息只会被消费一次,有重复消费的可能
- 消息回溯:已经消费的消息,有些业务场景可能要重复消费,因此RocketMQ支持按照时间向前或者向后进行消息回溯
- 消息堆积:消息中间件的作用主要用来异步解耦,需要应对数据洪峰,因此要求具备一定的消息堆积能力,RocketMQ和kafka一样,都是使用磁盘文件存储消息,物理布局上为多个大小相等的文件组成逻辑文件组,可以循环使用
- 定时消息:RocketMQ不支持任意进度的定时消息,只支持特定延迟级别
- 消息重试:RocketMQ同样支持消息重试
RocketMQ部署模型
-
生产者
- 发布消息的角色。Producer通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败和重试。
-
消费者
- 支持以推(push),拉(pull)两种模式对消息进行消费。
- 同时也支持集群方式和广播方式的消费。
- 提供实时消息订阅机制,可以满足大多数用户的需求。
-
注册中心
- RocketMQ抛弃了传统zk,而是自己用Netty开发了一个名为"NameServer"的注册中心,NameServer是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现。从实际需求出发,topic路由信息无需在集群之间保持强一致,而是追求最新一执行,并且能容忍分钟级别不一致。基于这个理念,大大的降低了NamerServer实现的复杂程度,性能相对于zk也有了极大的提升
-
代理服务器 Broker
- Broker主要负责消息的存储、投递和查询以及服务高可用保证。NameServer几乎无状态节点,因此可集群部署,节点之间无任何信息同步。Broker部署相对复杂。在 Master-Slave 架构中,Broker 分为 Master 与 Slave。一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master 与 Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。
-
小节
- 每个 Broker 与 NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。
- Producer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取Topic路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态。
- Consumer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave发送心跳。Consumer 既可以从 Master 订阅消息,也可以从Slave订阅消息。
总结
RocketMQ自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。
作为IT从业者,虽然不一定有机会在生产环境中真实的使用,不过技多不压身,多学一些总是没错的,最后附上一张RocketMQ vs Kafka vs ActiveMQ对比。
Messaging Product | Client SDK | Protocol and Specification | Ordered Message | Scheduled Message | Batched Message | BroadCast Message | Message Filter | Server Triggered Redelivery | Message Storage | Message Retroactive | Message Priority | High Availability and Failover | Message Track | Configuration | Management and Operation Tools |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ActiveMQ | Java, .NET, C++ etc. | Push model, support OpenWire, STOMP, AMQP, MQTT, JMS | Exclusive Consumer or Exclusive Queues can ensure ordering | Supported | Not Supported | Supported | Supported | Not Supported | Supports very fast persistence using JDBC along with a high performance journal,such as levelDB, kahaDB | Supported | Supported | Supported, depending on storage,if using levelDB it requires a ZooKeeper server | Not Supported | The default configuration is low level, user need to optimize the configuration parameters | Supported |
Kafka | Java, Scala etc. | Pull model, support TCP | Ensure ordering of messages within a partition | Not Supported | Supported, with async producer | Not Supported | Supported, you can use Kafka Streams to filter messages | Not Supported | High performance file storage | Supported offset indicate | Not Supported | Supported, requires a ZooKeeper server | Not Supported | Kafka uses key-value pairs format for configuration. These values can be supplied either from a file or programmatically. | Supported, use terminal command to expose core metrics |
RocketMQ | Java, C++, Go | Pull model, support TCP, JMS, OpenMessaging | Ensure strict ordering of messages,and can scale out gracefully | Supported | Supported, with sync mode to avoid message loss | Supported | Supported, property filter expressions based on SQL92 | Supported | High performance and low latency file storage | Supported timestamp and offset two indicates | Not Supported | Supported, Master-Slave model, without another kit | Supported | Work out of box,user only need to pay attention to a few configurations | Supported, rich web and terminal command to expo |