RocketMQ入门

33 阅读7分钟

介绍

RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。

MQ应用场景

老生常谈,MQ想必在大家的工作当中或多或少的都会使用到,我们一般会用MQ解决一下午一些场景:

  • 削峰填谷:诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲,或因没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,消息队列RocketMQ可提供削峰填谷的服务来解决该问题。
  • 异步解耦:交易系统作为淘宝和天猫主站最核心的系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,消息队列RocketMQ可实现异步通信和应用解耦,确保主站业务的连续性。
  • 顺序收发:细数日常中需要保证顺序的应用场景非常多,例如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等等。与先进先出FIFO(First In First Out)原理类似,消息队列RocketMQ提供的顺序消息即保证消息FIFO。
  • 分布式事务一致性:交易系统、支付红包等场景需要确保数据的最终一致性,大量引入消息队列RocketMQ的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。
  • 大数据分析:数据在“流动”中产生价值,传统数据分析大多是基于批量计算模型,而无法做到实时的数据分析,利用阿里云消息队列RocketMQ与流式计算引擎相结合,可以很方便的实现业务数据的实时分析。
  • 分布式缓存同步:天猫双11大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因带宽瓶颈,限制了商品变更的访问流量,通过消息队列RocketMQ构建分布式缓存,实时通知商品数据的变化。

RocketMQ生产消费模型

image.png

RocketMQ的生产消费模型如上图,与大多数中间件一样,采用发布订阅模式,包含生产者、消费者、以及包括服务端,RocketMQ主要支持以下功能

  • 顺序消费:消费者按照消息到达消息服务器的顺序消费,RcoketMQ保证消息严格有序
  • 消息过滤:消费者针对同一主题下的消息按照规则只消费自己感兴趣的消息,消息过滤需要服务端和客户端的共同参与
  • 消息存储:RocketMQ为了追求消息存储的高性能,引入了内存映射机制,所有的消息按照顺序的存储在同一个文件当中,为了避免消息无限制的存储,还引入了消息文件过期机器预计存储空间告警
  • 消息高可用:RocketMQ支持同步涮盘和异步刷盘,同步刷盘可以保证除了硬件故障外,其他场景不丢失数据;异步刷盘在异常场景会丢失少量消息
  • 消息保证最少消费一次:通过消费确认机制确保消息至少被消费一次,不过ack消息可能存在丢失的请求,因此RocketMQ无法保证消息只会被消费一次,有重复消费的可能
  • 消息回溯:已经消费的消息,有些业务场景可能要重复消费,因此RocketMQ支持按照时间向前或者向后进行消息回溯
  • 消息堆积:消息中间件的作用主要用来异步解耦,需要应对数据洪峰,因此要求具备一定的消息堆积能力,RocketMQ和kafka一样,都是使用磁盘文件存储消息,物理布局上为多个大小相等的文件组成逻辑文件组,可以循环使用
  • 定时消息:RocketMQ不支持任意进度的定时消息,只支持特定延迟级别
  • 消息重试:RocketMQ同样支持消息重试

RocketMQ部署模型

image.png

  • 生产者

    • 发布消息的角色。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 ProductClient SDKProtocol and SpecificationOrdered MessageScheduled MessageBatched MessageBroadCast MessageMessage FilterServer Triggered RedeliveryMessage StorageMessage RetroactiveMessage PriorityHigh Availability and FailoverMessage TrackConfigurationManagement and Operation Tools
ActiveMQJava, .NET, C++ etc.Push model, support OpenWire, STOMP, AMQP, MQTT, JMSExclusive Consumer or Exclusive Queues can ensure orderingSupportedNot SupportedSupportedSupportedNot SupportedSupports very fast persistence using JDBC along with a high performance journal,such as levelDB, kahaDBSupportedSupportedSupported, depending on storage,if using levelDB it requires a ZooKeeper serverNot SupportedThe default configuration is low level, user need to optimize the configuration parametersSupported
KafkaJava, Scala etc.Pull model, support TCPEnsure ordering of messages within a partitionNot SupportedSupported, with async producerNot SupportedSupported, you can use Kafka Streams to filter messagesNot SupportedHigh performance file storageSupported offset indicateNot SupportedSupported, requires a ZooKeeper serverNot SupportedKafka 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
RocketMQJava, C++, GoPull model, support TCP, JMS, OpenMessagingEnsure strict ordering of messages,and can scale out gracefullySupportedSupported, with sync mode to avoid message lossSupportedSupported, property filter expressions based on SQL92SupportedHigh performance and low latency file storageSupported timestamp and offset two indicatesNot SupportedSupported, Master-Slave model, without another kitSupportedWork out of box,user only need to pay attention to a few configurationsSupported, rich web and terminal command to expo