文章目录
- RocketMQ发展历程及基本概念
- RocketMQ简介
- 发展历程
- 基本概念
- 消息(Message)
- 主题(Topic)
- 标签(Tag)
- 队列(Queue)
- 分片(sharding)
- 消息标识(MessageID/Key)
RocketMQ发展历程及基本概念
RocketMQ简介
- RocketMQ是一个统一消息引擎、轻量级数据处理平台
- 是阿里巴巴开源的消息中间件,2016年成为Apache孵化项目。2017年孵化成为Apache顶级项目(TLP)
- 官网地址
发展历程
- 2007年,阿里开始五彩石项目,Notify作为项目中 交易核心消息流转系统应运而生,Notify系统是RocketMQ的雏形
- 2010年,B2B大规模使用ActiveMQ作为阿里的消息内核,阿里需要一个具有 海量堆积能力的消息系统
- 2011年初,kafka开源,淘宝中间件团队对Kafka进行深入研究后,开发了MetaMQ,2012年MetaMQ发展到了3.0版本,在它基础上进行进一步抽象,形成RocketMQ,并将其开源
- 2015年,阿里在RocketMQ基础上,又推出了针对阿里云上用户的消息系统AliwareMQ
- 2016年双十一,RocketMQ承载了万亿级消息流转,11月28日,阿里巴巴向Apache软件基金会捐赠RocketMQ
- 2017年5月29日,Apache宣布RocketMQ孵化成为Apache顶级项目(TLP),成为国内首个互联网中间件在Apache上的顶级项目
基本概念
消息(Message)
- 消息系统所传输的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题
主题(Topic)
- 表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。其关系为:主题:消息==一对多
标签(Tag)
- 为消息设置的标签,用于区分统一主题下不同类型的消息。统一业务单元的消息可以根据不同的业务目的在同一主题下设置不同标签。标签能有效地保持代码的清晰度和连贯性,并且优化RocketMQ提供的查询系统。消费者可以根据Tag实现不同子主题的不同消费逻辑,并且有了更好的扩展性
Topic 是消息的一级分类,Tag是消息的二级分类。
队列(Queue)
- 存储消息的物理实体,一个Topic可以包含多个Queue,每个Queue中存放的就是Topic的消息。一个Topic的Queue也被成为消息的分区(Partition)
- 一个Topic的Queue的消息只能被一个消费者组中的一个消费者消费(但是消息可以被不同消费者组的不同消费者消费)一个Queue中的消息不允许同一个消费者组中的多个消费者同时消费。如下图
分片(sharding)
分片不同于分区,RocketMQ的分片值得是存放响应Topic的Broker。每个分片中会创建出相应数量的分区(Queue)。每个Queue大小都是相同的,具体如下图:
消息标识(MessageID/Key)
- RocketMQ中每个消息拥有唯一的MessageId,且可以携带具有业务标识的Key,以方便对消息的查询。需要注意的是,MessageId有两个:在生产者send()消息时会自动生成一个MessageId(msgId),当消息到达Broker后,Broker也会自动生成一个MessageId(offsetMsgId)。msgId、offsetMsgId与key都称为消息标识。
- msgID:由producer端生成,规则为:producerIp+进程pid+MessigeClientIDSetter类ClassLoader的hashCode+当前时间+AutomicInteger自增计数器
- offsetMsId:由broker端生成,生成规则为brokerIp+物理分区的offset(Queue中的偏移量)
- key:用户指定的业务相关的唯一标识