消息队列高手课
李玥
京东零售技术架构部资深架构师
立即订阅
8426 人已学习
课程目录
已完结 41 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 优秀的程序员,你的技术栈中不能只有“增删改查”
免费
预习 | 怎样更好地学习这门课?
基础篇 (8讲)
01 | 为什么需要消息队列?
02 | 该如何选择消息队列?
03 | 消息模型:主题和队列有什么区别?
04 | 如何利用事务消息实现分布式事务?
05 | 如何确保消息不会丢失?
06 | 如何处理消费过程中的重复消息?
07 | 消息积压了该如何处理?
08 | 答疑解惑(一) : 网关如何接收服务端的秒杀结果?
进阶篇 (21讲)
09 | 学习开源代码该如何入手?
10 | 如何使用异步设计提升系统性能?
11 | 如何实现高性能的异步网络传输?
12 | 序列化与反序列化:如何通过网络传输结构化的数据?
13 | 传输协议:应用程序之间对话的语言
14 | 内存管理:如何避免内存溢出和频繁的垃圾回收?
加餐 | JMQ的Broker是如何异步处理消息的?
15 | Kafka如何实现高性能IO?
16 | 缓存策略:如何使用缓存来减少磁盘IO?
17 | 如何正确使用锁保护共享数据,协调异步线程?
18 | 如何用硬件同步原语(CAS)替代锁?
19 | 数据压缩:时间换空间的游戏
20 | RocketMQ Producer源码分析:消息生产的实现过程
21 | Kafka Consumer源码分析:消息消费的实现过程
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
23 | RocketMQ客户端如何在集群中找到正确的节点?
24 | Kafka的协调服务ZooKeeper:实现分布式系统的“瑞士军刀”
25 | RocketMQ与Kafka中如何实现事务?
26 | MQTT协议:如何支持海量的在线IoT设备?
27 | Pulsar的存储计算分离设计:全新的消息队列设计思路
28 | 答疑解惑(二):我的100元哪儿去了?
案例篇 (7讲)
29 | 流计算与消息(一):通过Flink理解流计算的原理
30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务
31 | 动手实现一个简单的RPC框架(一):原理和程序的结构
32 | 动手实现一个简单的RPC框架(二):通信与序列化
33 | 动手实现一个简单的RPC框架(三):客户端
34 | 动手实现一个简单的RPC框架(四):服务端
35 | 答疑解惑(三):主流消息队列都是如何存储消息的?
测试篇 (2讲)
期中测试丨10个消息队列热点问题自测
免费
期末测试 | 消息队列100分试卷等你来挑战!
结束语 (1讲)
结束语 | 程序员如何构建知识体系?
消息队列高手课
登录|注册

35 | 答疑解惑(三):主流消息队列都是如何存储消息的?

李玥 2019-10-15
你好,我是李玥。
在我们一起做了两个实践案例以后,相信你或多或少都会有一些收获。在学习和练习这两个实践案例中,我希望你收获的不仅仅是流计算和 RPC 框架的设计实现原理,还能学会并掌握在实现这些代码过程中,我们用到的很多设计模式和编码技巧,以及代码背后无处不在的“松耦合”、“拥抱变化”这些设计思想。最重要的是,把这些学到的东西能最终用在你编写的代码中,才是真正的收获。
照例,在每一模块的最后一节课,我们安排热点问题答疑,解答同学们关注比较多的一些问题。

1. 主流消息队列都是如何存储消息的?

我在之前的课程中提到过,现代的消息队列它本质上是一个分布式的存储系统。那决定一个存储系统的性能好坏,最主要的因素是什么?就是它的存储结构。
很多大厂在面试的时候,特别喜欢问各种二叉树、红黑树和哈希表这些你感觉平时都用不到的知识,原因是什么?其实,无论是我们开发的应用程序,还是一些开源的数据库系统,在数据量达到一个量级之上的时候,决定你系统整体性能的往往就是,你用什么样的数据结构来存储这些数据。而大部分数据库,它最基础的存储结构不是树就是哈希表。
即使你不去开发一个数据库,在设计一个超大规模的数据存储的时候,你也需要掌握各种数据库的存储结构,才能选择一个适合你的业务数据的数据库产品。所以,掌握这些最基础的数据结构相关的知识,是很有必要的,不仅仅是为了应付面试。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《消息队列高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 芥末小龙
    玥哥,已经完结了,在重新撸一遍 希望有更大的收获。

    作者回复: 记得来请我吃饭哈。

    2019-10-16
    1
    2
  • jack
    老师,关于RocketMQ以broker为单位进行存储,那么读取的时候,每个主题岂不是得去不同的文件中分别读取批量消息,读取性能上是不是不如kafka呢?

    作者回复: 从存储结构上来说,确实是这样的。

    2019-10-15
    1
    1
  • leslie
    除了手动案例的实践部分:基本上算是全程跟完了,这个专栏是自己第一个全程基本完全一篇不拉的学习完的课程;感谢老师一路以来的辛勤付出和答惑。
           老师今天所提的算法问题其实后面自己在读老师贴出来的代码就意识到了自己的这个弱点,同样是由于意识到课程的算法这块需求,特意参加了算法训练营-现在是极客大学算法训练营第四期的学员,希望在第四期完课时自己这块的致命弱点能强化许多。虽然开学典礼和覃超老师沟通时说我要毕业有点难度,不过自己会努力的去学和练,相信只要付出了努力且跟着老师学习自己应当可以毕业;同样这几天的实践由于去北京参加开学典礼落下了,动手实践只能后面补上然后强化了。
           记得老师在开篇词留的话题是"留言区立个 Flag,写下你的学习计划或目标":3个月左右的坚持跟下来我觉得我达到了自己的目标-算是不辜负自己的努力和老师的辛勤教诲,现在只是欠缺实践操作而已。感谢老师一路来的顿顿教诲和辛勤付出,希望将来还能看到老师的分享;谢谢。
    2019-10-15
    1
    1
  • Dovelol
    老师好,想请教下关于RocketMQ,消息存储时是用的mappedByteBuffer将commitLog文件全部映射到内存中,那么commitLog文件如果有1G的话,映射的mappedByteBuffer对象也会在内存中占用1G大小吗?能详细讲一下是怎么映射的吗?

    作者回复: 不会,这个地方就是我讲到过的PageCache。这个地方是由操作系统来控制的,简单的说,当你创建一个1GB的mappedByteBuffer的时候,其实操作系统一点儿内存都没有给你申请,只是记录了一个映射关系,然后给你了一段虚拟的内存地址。当你访问到这个mappedByteBuffer中的某个页(一小段内存,一般是4K大小),如果这个页不存在,会引发缺页中断,操作系统才会把这个页从磁盘上加载到内存中。

    2019-11-18
  • Dovelol
    老师想问下,kafka的消息存储,offset是从0往上涨,有没有最大值,如果溢出了kafka是怎么处理呢?

    作者回复: 这个最大值时Long.MAX_VALUE,你可以查一下这个值具体有多大,我估计没有人能活到这个值溢出吧?

    2019-11-14
  • humor
    DriverManager是怎么知道加载哪个JDBC驱动的呢? 代码里并没有把驱动的类名传过去呀

    作者回复: JDBC 4.0 已经支持SPI机制了,只要把驱动放在classpath里面就会自动加载的。

    2019-10-16
  • A9
    RocketMQ以Broker为单位,较粗的力度牺牲了灵活性,带来的好处是在写入的时候,同时写入的文件更少,有更好的批量(不同主题和分区的数据可以组成一批一起写入),更多的顺序写入,尤其是在Broker上有很多主题和分区的情况下,有更好的写入性能
    -----------------------------------------
    老师,关于RocketMQ的Broker单文件写入CommitLog的问题,感觉上按照partition来写入的Kafka不是能有更高的并发写入吗,为什么写单个文件的RocketMQ会有更好的写入性能?

    作者回复: 这个是磁盘的特性决定的,磁盘的连续顺序写的性能要远远好于 并发写。

    2019-10-16
    1
  • 每天晒白牙
    老师的专栏写的真好,特别深入,实战篇偷懒了没去操作,需要找时间写写这个rpc框架了,前面30多节都坚持了
    2019-10-15
  • 乐溪溪520
    跟着老师的更新,把专栏学习了一遍。当然,一遍肯定是不能掌握所有的知识点的。需要两次或者三次的学习,才能把重要的知识转化成自己的知识。一个专栏的结束不是结束,而是新的开始。感谢老师的分享。
    2019-10-15
收起评论
9
返回
顶部