2022-02-24_星期四

消息队列高手课

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”后,我们会深刻领会到自己收纳的东西越来越喜欢,自身的审美意识和品味在逐渐地提升。

“先出”的概念与新陈代谢或呼吸运动也是相通的。有意识地“先出后进”,才能唤起良性循环。

updatedupdated2022-03-092022-03-09