没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
消息队列常见面试题 在计算机科学领域,消息队列和邮箱都是软件工程组件,通常用于进程间或同一进程内的线 程通信。它们通过队列来传递消息-传递控制信息或内容,群组通信系统提供类似的功能。 从消息队列常见面试题入手来解析消息队列 如何设计一个消息队列? 消息队列设计成推消息还是拉消息?RocketMQ和Kafka是怎么做的? 消息队列之事务消息?RocketMQ和Kafka是怎么做的? 比 RocketMQ 更好的事务消息实现是什么? Kafka的索引设计有什么亮点? Kafka日志段如何读写解析? Kafka控制器事件处理全流程解析 Kafka请求处理全流程解析 Kafka为什么要抛弃Zookeeper? 进阶必看的 RocketMQ,这次一网打尽 Kafka和RocketMQ底层存储揭秘,为什么能这么快?
资源推荐
资源详情
资源评论














前言
作者BB
大家好呀,我是 yes,是这本消息队列核心知识点电子书的作者,电子书的全部内容整理自我的个人公
众号「yes的练级攻略」里的关于消息队列的文章。
公众号里面还有别的系列,比如 JVM 、MySQL 、Spring 等等,这个日后也会整理出 PDF,可以微信搜
索「yes的练级攻略」关注我的公众号,进行一波更进,内容都是首发公众号的。
这本 PDF,我称之为 0.1 版本,主要涵盖了关于消息队列的大部分核心知识点,涉及的消息队列有
RocketMQ、Kafka。
对于里面的大多数内容都进行了源码层面的解析,做到真正的源码级别理解,大家不要怕会被源码劝退
了,源码剖析之后我都进行了图解,照着图来理解,非常舒服~
所以,如果你想要深入消息队列,这本 PDF 很适合你;如果你想在面试官前面装一下,这本 PDF 也很
适合你;如果你个人想深入源码,但是不知道如何入手,这本 PDF 还是很适合你。
当然,这是这本 PDF 的第一个版本,也算是内测版本,如有错误可以通过公众号联系我,期待你的指
正和探讨。
再说一下关于面试方向的问题。不吹牛,这本 PDF 的深度对于大厂面试题来说绝对够了,你读完就知
道啦~
还有,这本书的内容不像教科书那般连贯,因为是公众号文章合成的,但是我还是建议从前往后读,因
为我个人对内容的先后还是做了排版的。
本 PDF 大纲:
从消息队列常见面试题入手来解析消息队列
如何设计一个消息队列?
消息队列设计成推消息还是拉消息?RocketMQ和Kafka是怎么做的?
消息队列之事务消息?RocketMQ和Kafka是怎么做的?
比 RocketMQ 更好的事务消息实现是什么?
Kafka的索引设计有什么亮点?
Kafka日志段如何读写解析?
Kafka控制器事件处理全流程解析
Kafka请求处理全流程解析
Kafka为什么要抛弃Zookeeper?
进阶必看的 RocketMQ,这次一网打尽
Kafka和RocketMQ底层存储揭秘,为什么能这么快?
未完待更新
从消息队列常见面试题入手来解析消息队列
今儿咱们就来盘一盘大方向上的消息队列有哪些核心注意点。
核心点有很多,为了更贴合实际场景,我从常见的面试问题入手:
如何保证消息不丢失?
如果处理重复消息?

如何保证消息的有序性?
如果处理消息堆积?
当然在剖析这几个问题之前需要简单的介绍下什么是消息队列,消息队列常见的一些基本术语和概念。
接下来进入正文。
什么是消息队列
来看看维基百科怎么说的,顺带学学英语这波不亏:
In computer science, message queues and mailboxes are software-engineering
components typically used for inter-process communication (IPC), or for inter-thread
communication within the same process. They use a queue for messaging – the passing of
control or of content. Group communication systems provide similar kinds of functionality.
翻译一下:在计算机科学领域,消息队列和邮箱都是软件工程组件,通常用于进程间或同一进程内的线
程通信。它们通过队列来传递消息-传递控制信息或内容,群组通信系统提供类似的功能。
简单的概括下上面的定义:消息队列就是一个使用队列来通信的组件。
上面的定义没有错,但就现在而言我们日常所说的消息队列常常指代的是消息中间件,它的存在不仅仅
只是为了通信这个问题。
为什么需要消息队列
从本质上来说是因为互联网的快速发展,业务不断扩张,促使技术架构需要不断的演进。
从以前的单体架构到现在的微服务架构,成百上千的服务之间相互调用和依赖。从互联网初期一个服务
器上有 100 个在线用户已经很了不得,到现在坐拥10亿日活的微信。我们需要有一个「东西」来解耦
服务之间的关系、控制资源合理合时的使用以及缓冲流量洪峰等等。
消息队列就应运而生了。它常用来实现:异步处理、服务解耦、流量控制。
异步处理
随着公司的发展你可能会发现你项目的请求链路越来越长,例如刚开始的电商项目,可以就是粗暴的扣
库存、下单。慢慢地又加上积分服务、短信服务等。这一路同步调用下来客户可能等急了,这时候就是
消息队列登场的好时机。
调用链路长、响应就慢了,并且相对于扣库存和下单,积分和短信没必要这么的 "及时"。因此只需要在
下单结束那个流程,扔个消息到消息队列中就可以直接返回响应了。而且积分服务和短信服务可以并行
的消费这条消息。
可以看出消息队列可以减少请求的等待,还能让服务异步并发处理,提升系统总体性能。

想必大家都听过「削峰填谷」,后端服务相对而言都是比较「弱」的,因为业务较重,处理时间较长。
像一些例如秒杀活动爆发式流量打过来可能就顶不住了。因此需要引入一个中间件来做缓冲,消息队列
再适合不过了。
网关的请求先放入消息队列中,后端服务尽自己最大能力去消息队列中消费请求。超时的请求可以直接
返回错误。
当然还有一些服务特别是某些后台任务,不需要及时地响应,并且业务处理复杂且流程长,那么过来的
请求先放入消息队列中,后端服务按照自己的节奏处理。这也是很 nice 的。
上面两种情况分别对应着生产者生产过快和消费者消费过慢两种情况,消息队列都能在其中发挥很好的
缓冲效果。
注意
引入消息队列固然有以上的好处,但是多引入一个中间件系统的稳定性就下降一层,运维的难度抬高一
层。因此要权衡利弊,系统是演进的。
消息队列基本概念
消息队列有两种模型:队列模型和发布/订阅模型。
队列模型
生产者往某个队列里面发送消息,一个队列可以存储多个生产者的消息,一个队列也可以有多个消费
者,
但是消费者之间是竞争关系,即每条消息只能被一个消费者消费。
发布/订阅模型
为了解决一条消息能被多个消费者消费的问题,发布/订阅模型就来了。该模型是将消息发往一个
Topic 即主题中,所有订阅了这个 Topic 的订阅者都能消费这条消息。
其实可以这么理解,发布/订阅模型等于我们都加入了一个群聊中,我发一条消息,加入了这个群聊的
人都能收到这条消息。
那么队列模型就是一对一聊天,我发给你的消息,只能在你的聊天窗口弹出,是不可能弹出到别人的聊
天窗口中的。
讲到这有人说,那我一对一聊天对每个人都发同样的消息不就也实现了一条消息被多个人消费了嘛。

是的,通过多队列全量存储相同的消息,即数据的冗余可以实现一条消息被多个消费者消费。
RabbitMQ 就是采用队列模型,通过 Exchange 模块来将消息发送至多个队列,解决一条消息需要被
多个消费者消费问题。
这里还能看到假设群聊里除我之外只有一个人,那么此时的发布/订阅模型和队列模型其实就一样了。
小结一下
队列模型每条消息只能被一个消费者消费,而发布/订阅模型就是为让一条消息可以被多个消费者消费
而生的,当然队列模型也可以通过消息全量存储至多个队列来解决一条消息被多个消费者消费问题,但
是会有数据的冗余。
发布/订阅模型兼容队列模型,即只有一个消费者的情况下和队列模型基本一致。
RabbitMQ 采用队列模型, RocketMQ 和 Kafka 采用发布/订阅模型。
接下来的内容都基于发布/订阅模型。
常用术语
一般我们称发送消息方为生产者 Producer ,接受消费消息方为消费者 Consumer ,消息队列服务端为
Broker 。
消息从 Producer 发往 Broker , Broker 将消息存储至本地,然后 Consumer 从 Broker 拉取消息,或
者 Broker 推送消息至 Consumer ,最后消费。
为了提高并发度,往往发布/订阅模型还会引入队列或者分区的概念。即消息是发往一个主题下的某个
队列或者某个分区中。 RocketMQ 中叫队列, Kafka 叫分区,本质一样。
例如某个主题下有 5 个队列,那么这个主题的并发度就提高为 5 ,同时可以有 5 个消费者并行消费该主
题的消息。一般可以采用轮询或者 key hash 取余等策略来将同一个主题的消息分配到不同的队列
中。
与之对应的消费者一般都有组的概念 Consumer Group , 即消费者都是属于某个消费组的。一条消息会
发往多个订阅了这个主题的消费组。
剩余103页未读,继续阅读
资源评论



geek@z
- 粉丝: 5
- 资源: 27
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
