RocketMQ基础篇(上)

前言

    本专题会对RocketMQ包括基础篇、底层原理、源码分析与性能优化和实战篇进行详细的讲解。  

千里之行,始于足下。                

                      ——老子

大纲

图示
图示

基础入门

1.消息中间件[MQ]的定义

    其实并没有标准定义。一般认为,消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。

    高效:对于消息的处理速度快。

    可靠:一般消息中间件都会有消息持久化机制和其他的机制确保消息不丢失。

    异步:指发送完一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

    一句话总结,我们消息中间件不生产消息,只是消息的搬运工。

图例

2.为什么要使用消息中间件?

(1)应用解耦

    系统的耦合性越高,容错性就越低。 以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。

    使用消息中间件,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统恢复后,继续处理存放在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。

图例

(2)流量削峰

    应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提高系统的稳定性和用户体验。

    互联网公司的大促场景(双十一、店庆活动、秒杀活动)都会使用到MQ。

图示

(3)数据分发

    通过消息队列可以让数据在多个系统之间进行沟通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可。

    接口调用的弊端,无论是新增系统,还是移除系统,代码改造工作量都很大。

    使用MQ做数据分发好处,无论是新增系统,还是移除系统,代码改造工作量较小。

    所以使用MQ做数据的分发,可以提高团队开发的效率。

接口调用图例
MQ图例

RocketMQ产品发展

1.RocketMQ版本发展

    Metaq(Metamorphosis)1.x,是RocketMQ前身的第一个版本,本质上把Kafka做了一次java版本的重写(Kafka是scala)。

    Metaq 2.x,主要是对存储部分进行了优化,因为Kafka的数据存储,它的paration是一个全量的复制,在阿里、在淘宝的这种海量交易。Kafka这种机制的横向拓展是非常不好的。2012年阿里同时把Metaq 2.0从阿里内部开源出来,取名RocketMQ,同时为了命名上的规范(版本上延续),所以这个就是RocketMQ3.0。

    现在RocketMQ主要维护的是4.x的版本,也是大家使用得最多的版本,2017年从Apache顶级项目毕业。

2.阿里内部项目的使用

     那么在阿里公司内部,原则上遵守开源共建原则。RocketMQ项目只维护核心功能,且去除了所有其他运行时的依赖,核心功能最简化。每个BU(Business Unit业务单元)的个性化需求都在RocketMQ项目之上进行深度定制。RocketMQ向其他BU提供的仅仅是Jar包,例如要定制一个Broker,那么只需要依赖rocketmq-broker这个jar包即可,可通过API进行交互,如果定制client,则依赖rocketmq-client这个jar包,对其提供的api进行再封装。

    在RocketMQ项目基础上几个常用的项目如下

    为淘宝应用提供消费服务:com.taobao.metaq v3.0 = RocketMQ + 淘宝个性化需求

    为支付宝应用提供消费服务:com.alipay.zpullmsg v1.0 = RocketMQ + 支付宝个性化需求

    为B2B应用提供消息服务:com.alibaba.commonmq v1.0 = Notify + RocketMQ + B2B个性化需求

3.展望未来

    从阿里负责RocketMQ的架构核心人员的信息来看,阿里内部一直全力拓展RocketMQ。

    2017年10月份,OpenMessaging项目由阿里巴巴发起,与雅虎、滴滴出行、Streamlio公司共同参与创立,项目意在创立厂商无关、平台无关的分布式消息及流处理领域的应用开发标准。同时OpenMessaging入驻Linux基金会。

    OpenMessaging项目已经开始在Apache RocketMQ中率先落地,并推广至整个阿里云平台。

    另外RocketMQ5的版本也在内部推进,主要的方向是Cloud Native(云原生)。

    另外还要讲一下Apache RocketMQ的商业版本,Aliware MQ在微服务、流计算、loT、异步解耦、数据同步等场景有非常广泛的运用。

图示

RocketMQ的物理架构

    消息队列RocketMQ是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,是阿里巴巴双11使用的核心产品。

    RocketMQ的设计基于主题的发布与订阅模式,其核心功能包括消息发送、消息存储(Broker)、消息消费,整体设计追求简单与性能第一。

1.核心概念

图示

(1)NameServer

    NameServer是整个RocketMQ的“大脑”,它是RocketMQ的服务注册中心,所以RocketMQ需要先启动NameServer再启动Rocket中的Broker。

    Broker在启动时向所有NameServer注册(主要是服务器地址等),生产者在发送消息之前先从NameServer获取Broker服务器地址列表(消费者一样),然后根据负载均衡算法从列表中选择一台服务器进行消息发送。

    NameServer与每台Broker服务保持长连接,并间隔30s检查Broker是否存活,如果检测到Broker宕机,则从路由注册表中将其移除。这样就可以实现RocketMQ的高可用。

(2)生产者(Producer)

    生产者:也称为消息发布者,负责生产并发送消息至RocketMQ。

(3)消费者(Consumer)

    消费者:也称为消息订阅者,负责从RocketMQ接收并消费消息。

(4)消息(Message)

    消息:生产或者消费的数据,对于RocketMQ来说,消息就是字节数组。

(5)主机(Broker)

    RocketMQ的核心,用于暂存和传输消息。

2.物理架构中的整体运转

    1.NameServer先启动。

    2.Broker启动时向NameServer注册。

    3.生产者在发送某个主题的消息之前先从NameServer获取Broker服务器地址列表(有可能是集群),然后根据负载均衡算法从列表中选择一台Broker进行消息发送。

    4.NameServer与每台Broker服务器保持长连接,并间隔30s检测Broker是否存在,如果检测到Broker宕机(使用心跳机制,如果检测超过120s),则从路由注册表中将其移除。

    5.消费者在订阅某个主题的消息之前从NameServer获取Broker服务器地址列表(有可能是集群),但是消费者选择从Broker中订阅消息,订阅规则由Broker配置决定。

RocketMQ的概念模型

1.核心概念

(1)分组(Group)

    生产者:标识发送同一类消息的Producer,通常发送逻辑一致。发送普通消息的时候,仅标识使用,并无特别用处。主要作用用于事务消息:(事务消息中如果某条发送某条消息的producer-A宕机,使得事务消息一直处于PREPARED状态并超时,则broker会回查同一个group的其它producer,确认这条消息应该commit还是rollback)。

    消费者:标识一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致。同一个Consumer Group下的各个实例将共同消费topic的消息,起到负载均衡的作用。

    消费进度以Consumer Group为粒度管理,不同Consumer Group之间消费进度彼此不受影响,即消息A被Consumer Group1消费过,也会再给Consumer Group2消费。

(2)主题(Topic)

    标识一类消息的逻辑名字,消息的逻辑管理单位。无论消息生产还是消费,都需要指定Topic。

    区分消息的种类:一个发送者可以发送消息给一个或者多个Topic:一个消息的接收者可以订阅一个或者多个Topic消息。

(3)标签(Tag)

    RocketMQ支持给在发送的时候给topic打tag,同一个topic的消息虽然逻辑管理是一样的。但是消费topic1的时候,如果你消费订阅的时候指定的是tagA,那么tagB的消息将不会投递。

(4)消息队列(Message Queue)

    简称Queue或Q。消息物理管理单位。一个Topic将有若干个Q。若一个Topic创建在不同的Broker,则不同的broker上都有若干Q,消息将物理地存储落在不同Broker结点上,具有水平扩展的能力。

    无论生产者还是消费者,实际的生产和消费都是针对Q级别。例如Producer发送消息的时候,会预先选择(默认轮询)好给Topic下面的某一条Q发送;Consumer消费的时候也会负载均衡地分配若干个Q,只拉取对应Q的消息。

    每一条message queue均对应一个文件,这个文件存储了实际消息的索引信息。并且即使文件被删除,也能通过实际纯粹的消息文件(commit log)恢复回来。

(5)偏移量(Offset)

    RocketMQ中,有很多offset的概念。一般我们只关心暴露到客户端的offset。不指定的话,就是指Message Queue下面的offset。

    Message queue是无限长的数组。一条消息进来下标就会涨1,而这个数组的下标就是offset,Message queue中的max offset表示消息的最大offset。

    Consumer offset可以理解为标记Consumer Group在一条逻辑Message Queue上,消息消费到哪里即消费进度。但从源码上看,这个数值是消费过的最新消费的消息offset+1,即实际上表示的是下次拉取的offset位置


我是娆疆_蚩梦,让坚持成为一种习惯,感谢各位大佬的:点赞收藏评论,我们下期见!


下一篇:RocketMQ基础篇(下)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • Apache RocketMQ 基础概念及架构解析 Apache RocketMQ 系列: Apache Rock...
    挂机的啊洋zzZ阅读 6,116评论 1 47
  • RocketMQ是一款分布式、队列模型的消息中间件,单机支持1万以上的持久化队列,前提是足够的内存、硬盘空间。 消...
    什么也不懂888阅读 1,344评论 0 4
  • 本篇博客主要参考:《浅入浅出》-RocketMQ[https://my.oschina.net/javaFamil...
    CoderBear阅读 1,427评论 0 8
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,879评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,046评论 0 4