在美国的大学课程中,101是所有课程中的第一门,是新生入学后的必修课程。阿里巴巴中间件技术专家刘振东在上周的Apache RocketMQ开发者沙龙北京站的活动上,进行了主题为《ApacheRocketMQ 101》的分享,帮助开发者从0开始学习 Apache RocketMQ,除了一些基础的入门内容外,还有很多是在社区未发表过的个人所感所悟,首次对外分享。分享内容包括RocketMQ的起源、RocketMQ概念模型、存储模型、部署模型和最佳实践总结,其中最佳实践的内容是阿里中间件技术类岗位的必考面试题。

嘉宾介绍:刘振东,阿里巴巴中间件技术专家,Apache RocketMQ  PMC/Committer,2016年中间件性能挑战赛亚军,具有丰富的分布式系统设计和优化经验,目前负责Apache RocketMQ新航道探索和创新。

一、RocketMQ的起源

通常,每个产品的诞生都源于一个具体的需求或问题,RocketMQ也不例外。起初,产品的原型像一个巨石,把所有需要实现的程序和接口都罗列到一起。但随着公司业务的发展,所有的系统和功能都在这个巨石上开发,当覆盖几百上千名开发人员的时候,瓶颈就出来了。这时候,就需要我们把系统进行分解。

图释:巨石 -> 分布式

分解后,就出现了上图中的分布式架构,这类架构最大的特点就是解耦,而RocketMQ的异步解耦意味着底层的重构不会影响到上层应用的功能。RocketMQ另一个优势是削峰填谷,在面临流量的不确定性时,实现对流量的缓冲处理。此外,RocketMQ的顺序设计特性使得RocketMQ成为一个天然的排队引擎,例如,三个应用同时对一个后台引擎发起请求,排队引擎的特性可以确保不会引起“撞车”事故。

二、RocketMQ的概念模型

对于任何一款中间件产品而言,清晰的概念模型是帮助开发者正确理解使用它的关键。从RocketMQ的概念模型来看:Topic是用于存储逻辑的地址的,Producer是信息的发送,Consumer是信息的接收者。

图释:最基本的概念模型

这只是一个基础的概念模型,在实际的生产中,结构会更复杂,例如我们需要对中间的Topic进行分区,出现多个有关联的Topic,再如同一个信息的发送方会有多个订阅者,同一个需求方会有多个发送方,出现一对多、多对一的情况。

图释:扩展后的概念模型

上图就是对Topic、Producer、Consumer扩展后的概念模型。RocketMQ中可以接触到的所有概念都可以在这个概念模型图中找到。左边有两个Producer,中间就是两个分布式的Topic,用于存储逻辑地址的两个Topic中分别有两个用于存储物理存储地址的Message Queue,Broker是实际部署过程的对应的一台设备,右边则是两个Consumer,Consumer Group是代表两个Consumer可共享相互之间的订阅。不同的Consumer Group相互独立。一句话总结就是不同的Group是广播订阅的,同一个Group则是负载订阅的。图中的连线表示各模块之间的关系,例如Consumer Group A中的Consumer1对应着Message Queue0和Message Queue1的两个队列,分布在BrokerA这一台设备上。

三、RocketMQ的存储模型

RocketMQ的消息的存储是由ConsumeQueue和CommitLog 配合来完成的,ConsumeQueue中只存储很少的数据,消息主体都是通过CommitLog来进行读写。

图释:存储模型

CommitLog:是消息主体以及元数据的存储主体,对CommitLog建立一个ConsumeQueue,每个ConsumeQueue对应一个(概念模型中的)MessageQueue,所以只要有Commit Log在,Consume Queue即使数据丢失,仍然可以恢复出来。

Consume Queue:是一个消息的逻辑队列,存储了这个Queue在CommitLog中的起始offset,log大小和MessageTag的hashCode。每个Topic下的每个Queue都有一个对应的ConsumerQueue文件,例如Topic中有三个队列,每个队列中的消息索引都会有一个编号,编号从0开始,往上递增。并由此一个位点offset的概念,有了这个概念,就可以对Consumer端的消费情况进行队列定义。

四、RocketMQ的部署模型

在实际的部署过程中,Broker是实际存储消息的数据节点,Nameserver则是服务发现节点,Producer发送消息到某一个Topic,并给到某个Consumer用于消费的过程中,需要先请求Nameserver拿到这个Topic的路由信息,即Topic在哪些Broker上有,每个Broker上有哪些队列,拿到这些请求后再把消息发送到Broker中;相对的,Consumer在消费的时候,也会经历这个流程。

图释:部署模型

五、RocketMQ最佳实践总结

这是我们在实践过程的总结,同时我们也把其中一些普适性的总结作为阿里中间件技术岗的面试题,目的是帮助大家更深刻的理解我们在设计分布式消息系统的一些思考和探索。

Q1:分布式消息系统中,如何避免消息重复?

造成消息重复的根本原因是:网络不可靠。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?

a. 消费端处理消息的业务逻辑保持幂等性;

b. 保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。

通过幂等性,不管来多少条重复消息,可以实现处理的结果都一样。再利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就可以不再处理这条消息,避免消息的重复处理。

Q2:顺序消息扩容的过程中,如何在不停写的情况下保证消息顺序?

1. 成倍扩容,实现扩容前后,同样的key,hash到原队列,或者hash到新扩容的队列;

2. 扩容前,记录旧队列中的最大位点;

3. 对于每个Consumer Group,保证旧队列中的数据消费完,再消费新队列,也即:先对新队列进行禁读即可;

Q3:分布式消息系统中,如何对消息进行重放?

消费位点就是一个数字,把Consumer Offset改一下就可以达到重放的目的了。

Apache RocketMQ部分开发者合影

原文链接
本文为云栖社区原创内容,未经允许不得转载。

读懂这篇文章,你的阿里技术面就可以过关了 | Apache RocketMQ 101相关推荐

  1. (转载)2010年股市只要读懂这篇文章想亏钱都难

    一,赢家重在观念正确 1 一年做一股!忠告,轻易不抛牛股,毕业.首选牛股.得半道,热点与强势股兼做,投资投机两相宜.得全道 2 操盘手最重要的是盘中的应变能力 3 定性是必须做好的.大周期定性,周线选 ...

  2. 读懂这篇文章就懂大数据,3000字概括《大数据时代》

    有言在先 近期有些起伏,这种情况最适合回归书本,寻找一些你内心认同的东西.这几天花了点时间重温<大数据时代>,整理.总结出了精华的东西,分享给大家. 大数据引起了变革 当今社会所独有的一种 ...

  3. requestAnimationFrame,读懂这篇文章就够了

    requestAnimationFrame 请求动画帧 它是一个浏览器的宏任务 requestAnimationFrame的用法与settimeout很相似,只是不需要设置时间间隔而已.request ...

  4. 读懂这篇文章,你就懂了全网通5.0

    上个月,千元标杆红米Note 5发布,新机支持全网通5.0,双卡双待4G,一边打电话一边打游戏也不会掉线. 那么相比小米去年推出的全网通4.0,全网统5.0有哪些进化呢?官方整理了"六问六答 ...

  5. 如何读懂一篇学术论文?

    如何总结和整理学术文献? 学习资料:世上最强大的科研工具手册 与其给 PDF 分类,真不如读完文章之后好好整理「读后的 notes」,以后需要什么内容就直接在 notes 里面搜索. *** 1. 需 ...

  6. 看懂这篇文章,你就懂了信息安全的密码学

    看懂这篇文章-你就懂了信息安全的密码学 一.前言 ​ 一个信息系统缺少不了信息安全模块,今天就带着大家全面了解并学习一下信息安全中的密码学知识,本文将会通过案例展示让你了解抽象的密码学知识,阅读本文你 ...

  7. Python怎么读?这篇文章说的很明白

    python是一门非常火爆且相对易学的编程语言,应用在各种场景.许多人想学习这门python编程语言,就连地产大佬潘石屹也已经学习了python,足见python的魅力. 那么有不少人问python怎 ...

  8. 不明觉厉!用了近10年,才有人读懂这篇论文

    绘图:Andreas de Santis 来源:环球科学 "数学物理开放问题"网站列出了数学物理领域最令人费解的13道难题.对科学家来说,解开其中任意一题,都是至高无上的荣誉.10 ...

  9. 只要你用微信,那一定要读今天这篇文章

    来源:微信派.微信公开课 这两天是微信诞生 10 周年的日子. 昨晚微信之父-张小龙,做了一场近两小时的演讲,我全程听完了,觉得只要你有在用微信,想用微信赚钱,那你一定要好好听听这场演讲,如果你昨晚没 ...

最新文章

  1. 什么是近似算法?它适用于哪些问题?这篇文章给你答案
  2. Divan and bitwise operations 异或,同或,组合数学(1500)
  3. [Done]Spring @Pointcut 切点调用不到(SpringAOP嵌套方法不起作用) 注意事项
  4. 新版本springboot-springboot与springcloud理解误区
  5. indesign2020突然闪退_Adobe Photoshop 2020打不开,总是闪退,罪魁祸首在这里
  6. python中将字符变为大写_python如何同时把字符串大写变小写,小写变大写
  7. percona 5.7.11root初始密码设置
  8. HDU1559 最大子矩阵【DP】
  9. 博客园模板--博客园老牛大讲堂
  10. PHP网站接入QQ互联实现QQ登录获取用户信息功能,超级简单,三个文件就搞定,无需费力地去了解官方提供的一大堆Demo文件
  11. 个人博客管理系统详解
  12. 关于我对游戏开发的理解
  13. LeetCode——解数独
  14. [顶][转]东北菜大集
  15. redis+Python实现小型动态IP池的搭建,仅需90行代码
  16. Tkinter 的text使用方法
  17. 如何利用手机访问电脑本地的localhost?
  18. 暴走的Polkadot (DOT)(上)
  19. 真侍魂_全角色特殊能力
  20. 腾讯T2大牛亲自教你!5214页PDF的进阶架构师学习笔记,终局之战

热门文章

  1. 【LeetCode笔记】347. 前K个高频元素(Java、优先队列、小顶堆、HashMap)
  2. mysql进阶3_MySQL进阶
  3. c# getresponsestream返回byte[]_C++模版和C#范型求同存异录(一)sizeof(T)
  4. 常用英雄胜率怎么刷_单排刷英雄胜率或者炸鱼方法。
  5. jeecg 导出的excel不能使用公式_微软:Excel公式是世界上使用最广泛的编程语言...
  6. 你们觉得很可笑,但是很多人信的,真的很多很多。。
  7. 教授直言:有些博导水平一般,名不副实,却不愿放弃招生指标
  8. 战胜柯洁战胜不了高中生?DeepMind挑战高中数学题,完败
  9. Python可以减少代码量?我不信
  10. 23种设计模式之组合模式