消息队列高手课
Kafka 的高性能设计中的几个关键的技术点:
- 使用批量处理的方式来提升系统吞吐能力
- 基于磁盘文件高性能顺序读写的特性来设计的存储结构
- 利用操作系统的 PageCache 来缓存数据,减少 IO 并提升读性能
- 使用零拷贝技术加速消费流程
批量处理
批量处理是一种非常有效的提升系统吞吐量的方法。
- 发送:当你调用
send()
方法发送一条消息之后,无论你是同步发送还是异步发送,Kafka 都不会立即就把这条消息发送出去。它会先把这条消息,存放在内存中缓存起来,然后选择合适的时机把缓存中的所有消息组成一批,一次性发给 Broker - Broker 处理:在 Broker 整个处理流程中,无论是写入磁盘、从磁盘读出来、还是复制到其他副本这些流程中,批消息都不会被解开,一直是作为一条“批消息”来进行处理的。
- 消费:在消费时,消息同样是以批为单位进行传递的,Consumer 从 Broker 拉到一批消息后,在客户端把批消息解开,再一条一条交给用户代码处理。
PageCache
PageCache 就是操作系统在内存中给磁盘上的文件建立的缓存。
应用程序从硬盘上读写文件:
- 写入文件的时候,操作系统会先把数据写入到内存中的 PageCache,然后再一批一批地写到磁盘上。
- 读取文件的时候,也是从 PageCache 中来读取数据,这时候会出现两种可能情况。
- 一种是 PageCache 中有数据,那就直接读取,这样就节省了从磁盘上读取数据的时间
- 另一种情况是,PageCache 中没有数据,这时候操作系统会引发一个缺页中断,应用程序的读取线程会被阻塞,操作系统把数据从文件中复制到 PageCache 中,然后应用程序再从 PageCache 中继续把数据读出来,这时会真正读一次磁盘上的文件,这个读的过程就会比较慢
应用程序在写入文件的时候,操作系统会先把数据写入到内存中的 PageCache,然后再一批一批地写到磁盘上。读取文件的时候,也是从 PageCache 中来读取数据,这时候会出现两种可能情况。 一种是 PageCache 中有数据,那就直接读取,这样就节省了从磁盘上读取数据的时间;另一种情况是,PageCache 中没有数据,这时候操作系统会引发一个缺页中断,应用程序的读取线程会被阻塞,操作系统把数据从文件中复制到 PageCache 中,然后应用程序再从 PageCache 中继续把数据读出来,这时会真正读一次磁盘上的文件,这个读的过程就会比较慢。
消费读消息都会命中 PageCache,带来的好处有两个:
- 一个是读取的速度会非常快
- 另外一个是,给写入消息让出磁盘的 IO 资源,间接也提升了写入的性能
零拷贝
直接从 PageCache 中把数据复制到 Socket 缓冲区中,这样不仅减少一次数据复制,更重要的是,由于不用把数据复制到用户内存空间,DMA 控制器可以直接完成数据复制,不需要 CPU 参与,速度更快。
后端技术面试 38 讲
接口隔离原则说:不应该强迫用户依赖他们不需要的方法。
通过使用接口隔离原则,我们可以将一个实现类的不同方法包装在不同的接口中对外暴露。应用程序只需要依赖它们需要的方法,而不会看到不需要的方法。
当一个类比较大的时候,如果该类的不同调用者被迫依赖类的所有方法,就可能产生不必要的耦合。对这个类的改动也可能会影响到它的不同调用者,引起误用,导致对象被破坏,引发 bug。
使用接口隔离原则,就是定义多个接口,不同调用者依赖不同的接口,只看到自己需要的方法。而实现类则实现这些接口,通过多个接口将类内部不同的方法隔离开来。
断舍离
在把杂物放入收纳箱之前最重要的是”分类“
观察一下市面上流行的”收纳术“,就会发现,很多都是一开始就进行具体分类,接着就是更加细微的分类,这样只会导致收纳出现混乱。
”7、5、1 法“指的是进行杂物收纳时,对收纳空间的物量进行的大致估测。
- “看不见的收纳空间”占 7 成
- “看得见的收纳空间”占 5 成
- “展示性的收纳空间”占 1 成
”7、5、1 法“与下一节的”1 out 1 in 法“统称为”总量限定法“。
当我们按照”7、5、1“的原则收纳好喜爱的物品后,假如突然又入手了一件新东西,就需要去掉之前的 Top10 的末位物品,而补入这个新物品。
反复进行这个“1 out 1 in”后,我们会深刻领会到自己收纳的东西越来越喜欢,自身的审美意识和品味在逐渐地提升。
“先出”的概念与新陈代谢或呼吸运动也是相通的。有意识地“先出后进”,才能唤起良性循环。