From 97150aafbeacf710b3e986b06f0e9a5e82fefd08 Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Sat, 8 May 2021 17:40:00 +0800 Subject: [PATCH 1/2] add kafka --- mq/Kafka.md | 179 +++++++++++++++++++++++++ mq/img/kafka_available_performance.png | Bin 0 -> 90644 bytes 2 files changed, 179 insertions(+) create mode 100644 mq/Kafka.md create mode 100644 mq/img/kafka_available_performance.png diff --git a/mq/Kafka.md b/mq/Kafka.md new file mode 100644 index 0000000..66cc606 --- /dev/null +++ b/mq/Kafka.md @@ -0,0 +1,179 @@ +# 你是否了解 Kafka + +分析: 如果只是宽泛地谈 Kafka,那么回答的点就要围绕 Kafka 的几个组成来。这个部分不必谈及“为什么 Kafka 高性能” “为什么 Kafka 高可用”等问题。因为按照一般的惯例,接下来就会聊这个话题。总跳回答的思路就是介绍一下 Kafka 的基本原理,几个主要概念。后面详细的内容,等后面面试官来提问。 + +![Kafka知识点](img/kafka_available_performance.png) + +答:Kafka 是一个基于发布订阅模式的消息队列中间件。它由 Producer, Consumer, Broker 和 Partition 几个组成。 + +Kafka 里面的每一个消息都属于一个主题,每一个主题都有多个 Partition。Partition 又可以使用主从复制模式,即 Partition 之间组成主从模式。这些 Partition 均匀分布在 Broker 上,以保证高可用。(这里点到了高可用,引导面试官探讨 Kafka 高可用)。每一个 Partition 内消息是有序的,即分区顺序性。(这一句是为了引出后面如何保证消息有序性) + +Producer 依据负载均衡设置,将消息发送到 Topic 的特定 Partition 下;(后面面试官可能会问负载均衡策略) + +Consumer 之间组成了 Consumer Group,可以有多个 Consumer Group 消费同一个 Topic,互相之间不会有影响。Kafka 强制要求每个 Partition 只能有一个 Consumer,并且 Consumer 采取拉模式,消费完一批消息之后再拉取一批(尝试引出来后面的拉模型的讨论); + +一个 Kafka 集群由多个 Broker 组成,每个 Broker 上存放着不同 Topic 的 Partition; + +![Topic,Broker 和 Partition](https://pic2.zhimg.com/80/v2-17a2d36445a764081b45e012397291bd_720w.jpg) + +## 扩展点 + +### Kafka 的高性能是如何保证的? + +分析:必考题。高性能的影响因素有很多,但是常考的就是顺序写 + 零拷贝。在这个问题之下,我们只需要罗列出来各个点,但是不做深入解释。在罗列完之后,我们重点对其中某些点做详细说明,一般我建议用零拷贝做深入阐释。当然,最好是记得所有的点,包括它们的细节,不过这样一回答,没有三五分钟答不完。 + +答:Kafka 高性能依赖于非常多的手段: +1. 零拷贝。在 Linux 上 Kafka 使用了两种手段,mmp (内存映射,一般我都记成妈卖批,哈哈哈) 和 sendfile,前者用于解决 Producer 写入数据,后者用于 Consumer 读取数据; +2. 顺序写:Kafka 的数据,可以看做是 AOF (append only file),它只允许追加数据,而不允许修改已有的数据。(后面是亮点)该手段也在数据库如 MySQL,Redis上很常见,这也是为什么我们一般说 Kafka 用机械硬盘就可以了。有人做过实验(的确有,你们可以找找,我已经找不到链接了),机械磁盘 Kafka 和 SSD Kafka 在性能上差距不大; +3. Page Cache:Kafka 允许落盘的时候,是写到 Page Cache的时候就返回,还是一定要刷新到磁盘(主要就是mmp之后要不要强制刷新磁盘),类似的机制在 MySQL, Redis上也是常见,(简要评价一下两种方式的区别)如果写到 Page Cache 就返回,那么会存在数据丢失的可能,但是 +4. 批量操作:包括 Producer 批量发送,也包括 Broker 批量落盘。批量能够放大顺序写的优势,比如说 Producer 还没攒够一批数据发送就宕机,就会导致数据丢失; +5. 数据压缩:Kafka 提供了数据压缩选项,采用数据压缩能减少数据传输量,提高效率; +6. 日志分段存储:Kafka 将日志分成不同的段,只有最新的段可以写,别的段都只能读。同时为每一个段保存了偏移量索引文件和时间戳索引文件,采用二分法查找数据,效率极高。同时 Kafka 会确保索引文件能够全部装入内存,以避免读取索引引发磁盘 IO。(这里有一点很有意思,就是在 MySQL 上,我们也会尽量说把索引大小控制住,能够在内存装下,在讨论数据库磁盘 IO 的时候,我们很少会计算索引无法装入内存引发的磁盘 IO,而是只计算读取数据的磁盘 IO) + +(批量操作+压缩的亮点)批量发送和数据压缩,在处理大数据的中间件中比较常见。比如说分布式追踪系统 CAT 和 skywalking 都有类似的技术。代价就是存在数据丢失的风险; +(数据压缩的亮点)数据压缩虽然能够减少数据传输,但是会消耗更过 CPU。不过在 IO 密集型的应用里面,这不会有什么问题; + +(下面是零拷贝详解) +一般的数据从网络到磁盘,或者从磁盘到网络,都需要经过四次拷贝。比如说磁盘到网络,要经过: +![四次拷贝](https://pic4.zhimg.com/80/v2-07f829c7a070c3444b1d8c99d4afd1bb_720w.jpg) + +1. 磁盘到内核缓冲区 +2. 内核缓冲区到应用缓冲区 +3. 应用缓冲区到内核缓冲区 +4. 内核缓冲区到网络缓冲 + +零拷贝则是去掉了第二和第三。(之所以叫零拷贝,并不是说完全没有拷贝,而是指没有CPU参与的拷贝,DMA的还在) + +Kafka 利用了两项零拷贝技术,mmp 和 sendfile。前者是用于解决网络数据落盘的,Kafka 直接利用内存映射,完成了“写入操作”,对于 Kafka 来说,完成了网络缓冲区到磁盘缓冲区的“写入”,之后强制调用`flush`或者等操作系统(有参数控制)。(继续补充细节,如果自己是JAVA开发并且记得的话)Java 提供了`FileChannel`和`MappedByteBuffer`两项技术来实现 MMP。 + +`sendfile`是另外一种零拷贝实现,主要解决磁盘到网络的数据传输。操作系统读取磁盘数据到内存缓冲,直接丢过去`socket buffer`,而后发送出去。很多中间件,例如 `Nignx`, `tomcat` 都采用了类似的技术。 + +关键字:零拷贝,顺序写,缓冲区,批量,压缩,分段存储 +顺口溜: +零拷贝,mmp(妈卖批),sendfile 快如🐔 +顺序写,缓冲区,落盘记得要刷新 +批量发,多压缩,一不小心丢数据 +日志多,分段存,内存里面放索引 + +#### 类似问题 +- 讨论到了零拷贝技术 + +### Kafka 的 ISR 是如何工作的? + +分析:考察的是 Partition 同步问题。回答这个问题的时候,要清晰解释清楚,一个 Producer 写入一条消息,到 Partition 同步完成的步骤。亮点在于说清楚,这些步骤如果出现问题会导致什么结果。这里还牵涉到三个基本概念,ISR,HW,LEO。容易混淆的两个时间点,一个是消息写入成功,一个是消息同步成功。这是两个不同的东西。同样,另外一个容易混淆的是,ISR 里面的分区数据和主分区还是有差别的,也就是说,我们认为从分区与主分区保持同步,并不是严格的。 + +答:ISR 是分区同步的概念。Kafka 为每个主分区维护了一个 ISR,处于 ISR 的分区意味着与主分区保持了同步(所以主分区也在 ISR 里面)。 + +当 Producer 写入消息的时候,需要等 ISR 里面分区的确认,当 ISR 确认之后,就被认为消息已经提交成功了。ISR 里面的分区会定时从主分区里面拉取数据,如果长时间未拉取,或者数据落后太多,分区会被移出 ISR。ISR 里面分区已经同步的偏移量被称为 LEO(Log End Offset),最小的 LEO 称为 HW(高水位,high water,这个用木桶来比喻就很生动,ISR 里面的分区已同步消息就是木板,高水位就取决于最短的那个木板,也就是同步最落后的),也就是消费者可以消费的最新消息。 + +![LEO 和 HW](https://img-blog.csdnimg.cn/20200706235345430.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FqaWFueWluZ3hpYW9xaW5naGFu,size_16,color_FFFFFF,t_70) + +当主分区挂掉的时候,会从 ISR 里面选举一个新的主分区出来。 + +(下面我们进一步解释一下 Producer 写入消息) +我们在 Producer 里面可以控制 ACK 机制。Producer 可以配置成三种: +1. Producer 发出去就算成功; +2. Producer 发出去,主分区写入本地磁盘就算成功; +3. Producer 发出去,ISR 所有的分区都写入磁盘,就算成功; + +其性能依次下降,但是可靠性依次上升。 + +(如果记得,可以补上这个说明)因为 ISR 里面包含了主分区,也就是说,如果整个 ISR 只有主分区,那么全部写入就退化为主分区写入。所以在可靠性要求非常高的情况下,我们要求 ISR 中分区不能少于三个。该参数可以在 Broker 中配置(min.insync.replicas) + +(回答到这里,我们基本上就说清楚了 ISR 的基本机制。下面我们横向对比一下 ISR 机制与别的主从同步机制。很明显的,就是 Producer 这种发送策略,是否等待同步完成,在很多中间件上都能看到,随便挑一个出来就可以。我这里总结一下: + +ISR 的同步机制和其它中间件机制也是类似的,在涉及主从同步的时候都要在性能和可靠性之间做取舍。通常的选项都是: +1. 主写入就认为成功 +2. 主写入,至少一个从写入就认为成功; +3. 主写入,大部分从库写入就认为成功(一般“大部分”是可以配置的,从这个意义上来说,2和3可以合并为一点); +4. 主写入,所有从库写入就认为成功; + +而“写入”也会有不同语义: +1. 中间件写到日志缓存就认为写入了; +2. 中间件写入到系统缓存(page cache)就认为写入了; +3. 中间件强制刷新到磁盘(发起了 fsync)就认为写入了; + +都是性能到可靠性的取舍。) + +(在面试的时候,可以考虑回答完 ISR 之后,将上面的总结说出来,可以借用 MySQL,Redis, ZK 来说明,这算是一般规律) + + +#### 类似问题 +- Kafka GC 时间过长会导致什么问题?可能导致分区被踢出去 ISR。 +- Kafka 是如何保证可靠性的?(除了 ISR 以外,还要强调一下 Partition 是分布在不同 Broker 上,以避免 Broker 宕机导致 Topic 不可用 +- 如何提高 Kafka 的可靠性 +- 如何提高 Kafka 吞吐量?可靠性和吞吐量在这里就是互斥的,调整参数只能提高一个,降低另外一个。 + +### 什么时候分区会被移出 ISR? + +分析:考察 ISR 的特点,要理解 Kafka 如何维护 ISR 的。其实就两个参数控制,一个是落后多少消息,一个是多久没同步。比较有亮点的是能够清楚答出是哪两个参数,另外一个刷亮点的机会,就是说清楚它们过大过小都会有什么影响。 + +答案:当分区触发两个条件中的任何一个时,都会被移除出 ISR。 +1. 消息落后太多,这个是参数`replica.lag.max.messages`。 +2. 分区长时间没有发起`fetch`请求,由参数`replica.lag.time.max.ms`控制。 + +(刷亮点,点出影响因素,后面面试官跟你探讨这些因素怎么影响的)基本上,除非是新的 Broker,否则几乎都是由网络、磁盘IO和GC引起的,大多数情况下,是负载过高导致的。 + +(点出过大过小的影响)这两个参数,过小会倒是 ISR 频繁变化,过大会导致可靠性降低,存在数据丢失的风险。 + +(如果你知道你们公司的配置)我们公司的配置是 XXX 和 XXX。 + +关键字:落后多少消息,多久没同步 + +#### 如何引导 +- 谈到 Kafka 可靠性可用性 + +### Kafka 的负载均衡策略有哪些? + +分析:一般考察的是 Producer 怎么把消息分到对应的 Partition 上。理论上来说就是两种,一个是轮询,一个是 Hash 取余。这取决于 Key 是否为 Null。但是我们可以结合实际中的一些现实场景,来做一些扩展说明。特别是 Hash 取余。这种问题,列举有什么策略一类的面试题,其实单纯列出来,只能说是合格,要想回答好,就需要针对性地结合自己的经历,重点分析某些策略的优劣。所以我们的回答会先简单介绍有哪些策略,后面会重点落在 Hash 取余上,着重分析 Hash Key 对负载均衡的问题。 + +最后我们将话题引到 Partition 负载均衡与消费者负载均衡不匹配的问题上。它是指,我们的消息的确分布均匀了,但是处理不同的消息可能有快有慢,在极端情况下,可能处理慢的消息都在特定的 Partition 上,因此导致某个消费者负载奇高,而其余的消费者却没有什么负载。 + +答案:一般来说有两种,一种是轮询,即 Producer 轮流挑选不同的 Partition;另外一种是 Hash 取余,这要求我们提供 Key。 +(接下来,我们讨论 Key 的选择对 Partition 负载的影响,主要是为了体现自己用 Kafka 解决不同问题的思路) + +Key 的选取,大原则上是采用业务特征 ID,或者业务特征的某些字段拼接而成。比如说,我们可以考虑按照用 Order ID(可以替换成自己项目里面的某些业务的ID)作为 Key,这意味某个订单的消息肯定落在特定的某个 Partition 上,这就保证了针对该订单的消息是有序的(这里面间接提到了有序性的问题,体现了自己对于 Partition 的理解)。 + +(说一下 Hash 策略的风险)但是 Hash 策略下,如果 Key 设置不当,可能会导致某些 Partition 承载了大多数的流量。比如说按照商家 ID 来作为 Key,那么可能某些热点商家,大卖家,其消息就集中在某个 Partition 上,导致负载不均衡。 + +(我们升华一下这个问题,就是这些负载策略实际上都只考虑 Partition 的负载,而没有考虑 Consumer 的负载,为了进一步凸显自己对负载均衡的理解) +无论是轮询,还是 Hash,都无法解决一个问题:它们没有考虑 Consumer 的负载。例如,我们可以用 Hash 策略均匀分布了消息,但是可能某些消息消费得慢,有些消息消费得快。假如说非常不幸我们消费得慢的消息都落在某个 Partition,那么该 Partition 的消费者和别的消费者比起来,消费起来就很慢,带来很大的延迟,甚至出现消息堆积。 + +关键字:轮询,Hash,Key 的选取 + +#### 类似的问题 +- 如何选取 Hash Key +- 你们是如何设置 Producer 推送消息到哪个 Partition 的? + +#### 如何引导 +- 在介绍 Kafka 的时候 +- 讨论到 Hash Key 选择的时候。其实不仅仅是 Kafka,所有基于 Hash 的负载均衡算法,都会有类似的问题。所谓的 Hash 冲突,也就是这个问题。 +- 聊到了消息有序性的时候 + +### 为什么 Kafka 的从 Partition 不能读取? + +分析:考察 Kafka 消费者拉取消息的特点。这个问题的背景是,一般的主从模式,从服务器都可以提供读服务,但是 Kafka 的从 Partition 是不能提供读服务的。所以这也是一个违背一般规律的问题。我们回答的点就要从 Kafka 本身消息存储和消费者消费特点两方面回答。为了方便记忆,以及清楚解释这个问题,我们可以对比 MySQL 的主从模式,假设 Kafka 允许读从 Partition 的数据,会发生什么。 + +答:首先是 Kafka 自身的限制,即 Kafka 强制要求一个 Partition 只能有一个 Consumer,因此 Consumer 天然只需要消费主 Partition 就可以。 + +那么假如说 Kafka 放开这种限制,比如说有多个 Consumer,分别从主 Partition 和从 Partition 上读取数据,那么会出现一个问题:即偏移量如何同步的问题。例如一个 Consumer 从 Partition A 读取了 0- 100 的消息,那么另外一个 Consumer 从 Partition B 上读取,就只能读取 100 之后的数据。那么 Kafka 就需要在不同的 Partition 之间协调这个已读取偏移量。而这是分布式一致性的问题,难以解决。 + +MySQL 的主从模式比起来,并没有这种问题,即 MySQL 不需要进行类似偏移量的协商。 + +而从另外一个角度来说,Kafka 的读取压力是远小于 MySQL 的,毕竟一个 Topic,是不会有特别多的消费者的。并且 Kafka 也不需要支持复杂查询,所以完全没必要读取从 Partition 的数据。 + +关键字:偏移量 + +### 为什么 Kafka 在消费者端采用了拉(PULL)模型? +分析:考察拉模型的特点。回答的关键点在于,对比拉模型和推模型,在 MQ 这种场景下的优缺点。加分点在于明确指出什么 MQ 使用了什么模型。 + +答:采用拉模型的核心原因在于,消费者的消费速率不同。在拉模型之下,消费者自己消费完毕就自己再去拉去一批,那么这种速率是由消费者自己控制的,所需要的控制信息也是由消费者自己保存的。而采用推模型,就意味着中间件要和消费者就速率问题进行协商,否则容易导致要么推送过快,要么推送过慢的问题。 + +推模型的一个极大的好处是避免竞争,例如在多个消费者拉同一主题的消息的时候,就需要保证,不同消费者不会引起并发问题。而 Kafka 不会有类似的问题,因为 Kafka 限制了一个 Partition 只能有一个消费者,所以拉模型反而更加合适。 + +关键字:谁控制,并发竞争 + +## References +[图解Kafka高可用机制](https://zhuanlan.zhihu.com/p/56440807) +[Kafka高性能原理](https://zhuanlan.zhihu.com/p/105509080) +[Kafka与零拷贝](https://zhuanlan.zhihu.com/p/78335525) \ No newline at end of file diff --git a/mq/img/kafka_available_performance.png b/mq/img/kafka_available_performance.png new file mode 100644 index 0000000000000000000000000000000000000000..7f604bb09d9e54098eb2b0d3ddd369c12da61d63 GIT binary patch literal 90644 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� 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 l-|IiI Date: Sun, 9 May 2021 22:46:50 +0800 Subject: [PATCH 2/2] Kafka Part1 update --- mq/Kafka.md | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/mq/Kafka.md b/mq/Kafka.md index 66cc606..01974ae 100644 --- a/mq/Kafka.md +++ b/mq/Kafka.md @@ -23,9 +23,9 @@ Consumer 之间组成了 Consumer Group,可以有多个 Consumer Group 消费 分析:必考题。高性能的影响因素有很多,但是常考的就是顺序写 + 零拷贝。在这个问题之下,我们只需要罗列出来各个点,但是不做深入解释。在罗列完之后,我们重点对其中某些点做详细说明,一般我建议用零拷贝做深入阐释。当然,最好是记得所有的点,包括它们的细节,不过这样一回答,没有三五分钟答不完。 答:Kafka 高性能依赖于非常多的手段: -1. 零拷贝。在 Linux 上 Kafka 使用了两种手段,mmp (内存映射,一般我都记成妈卖批,哈哈哈) 和 sendfile,前者用于解决 Producer 写入数据,后者用于 Consumer 读取数据; +1. 零拷贝。在 Linux 上 Kafka 使用了两种手段,mmap (内存映射,一般我都记成妈卖批,哈哈哈) 和 sendfile,前者用于解决 Producer 写入数据,后者用于 Consumer 读取数据; 2. 顺序写:Kafka 的数据,可以看做是 AOF (append only file),它只允许追加数据,而不允许修改已有的数据。(后面是亮点)该手段也在数据库如 MySQL,Redis上很常见,这也是为什么我们一般说 Kafka 用机械硬盘就可以了。有人做过实验(的确有,你们可以找找,我已经找不到链接了),机械磁盘 Kafka 和 SSD Kafka 在性能上差距不大; -3. Page Cache:Kafka 允许落盘的时候,是写到 Page Cache的时候就返回,还是一定要刷新到磁盘(主要就是mmp之后要不要强制刷新磁盘),类似的机制在 MySQL, Redis上也是常见,(简要评价一下两种方式的区别)如果写到 Page Cache 就返回,那么会存在数据丢失的可能,但是 +3. Page Cache:Kafka 允许落盘的时候,是写到 Page Cache的时候就返回,还是一定要刷新到磁盘(主要就是mmap之后要不要强制刷新磁盘),类似的机制在 MySQL, Redis上也是常见,(简要评价一下两种方式的区别)如果写到 Page Cache 就返回,那么会存在数据丢失的可能。 4. 批量操作:包括 Producer 批量发送,也包括 Broker 批量落盘。批量能够放大顺序写的优势,比如说 Producer 还没攒够一批数据发送就宕机,就会导致数据丢失; 5. 数据压缩:Kafka 提供了数据压缩选项,采用数据压缩能减少数据传输量,提高效率; 6. 日志分段存储:Kafka 将日志分成不同的段,只有最新的段可以写,别的段都只能读。同时为每一个段保存了偏移量索引文件和时间戳索引文件,采用二分法查找数据,效率极高。同时 Kafka 会确保索引文件能够全部装入内存,以避免读取索引引发磁盘 IO。(这里有一点很有意思,就是在 MySQL 上,我们也会尽量说把索引大小控制住,能够在内存装下,在讨论数据库磁盘 IO 的时候,我们很少会计算索引无法装入内存引发的磁盘 IO,而是只计算读取数据的磁盘 IO) @@ -35,28 +35,38 @@ Consumer 之间组成了 Consumer Group,可以有多个 Consumer Group 消费 (下面是零拷贝详解) 一般的数据从网络到磁盘,或者从磁盘到网络,都需要经过四次拷贝。比如说磁盘到网络,要经过: -![四次拷贝](https://pic4.zhimg.com/80/v2-07f829c7a070c3444b1d8c99d4afd1bb_720w.jpg) + +![四次拷贝](https://miro.medium.com/max/840/0*Q6eoQ-19bq-qkm_Y) 1. 磁盘到内核缓冲区 2. 内核缓冲区到应用缓冲区 3. 应用缓冲区到内核缓冲区 4. 内核缓冲区到网络缓冲 -零拷贝则是去掉了第二和第三。(之所以叫零拷贝,并不是说完全没有拷贝,而是指没有CPU参与的拷贝,DMA的还在) +零拷贝则是去掉了第二和第三。(之所以叫零拷贝,并不是说完全没有拷贝,而是指没有CPU参与的拷贝,DMA的还在)。 + +![零拷贝](https://miro.medium.com/max/700/0*es45Nv-ea2WDtI0n) + +(这一段可选,因为比较冷僻)如果在 Linux 高版本下,而且支持 DMA gather copy,那么内核缓冲区到 -Kafka 利用了两项零拷贝技术,mmp 和 sendfile。前者是用于解决网络数据落盘的,Kafka 直接利用内存映射,完成了“写入操作”,对于 Kafka 来说,完成了网络缓冲区到磁盘缓冲区的“写入”,之后强制调用`flush`或者等操作系统(有参数控制)。(继续补充细节,如果自己是JAVA开发并且记得的话)Java 提供了`FileChannel`和`MappedByteBuffer`两项技术来实现 MMP。 +![零拷贝](https://miro.medium.com/max/700/0*XJNUTI5QoiCzSbxE) + +Kafka 利用了两项零拷贝技术,mmap 和 sendfile。前者是用于解决网络数据落盘的,Kafka 直接利用内存映射,完成了“写入操作”,对于 Kafka 来说,完成了网络缓冲区到磁盘缓冲区的“写入”,之后强制调用`flush`或者等操作系统(有参数控制)。(继续补充细节,如果自己是JAVA开发并且记得的话)Java 提供了`FileChannel`和`MappedByteBuffer`两项技术来实现 mmap。 `sendfile`是另外一种零拷贝实现,主要解决磁盘到网络的数据传输。操作系统读取磁盘数据到内存缓冲,直接丢过去`socket buffer`,而后发送出去。很多中间件,例如 `Nignx`, `tomcat` 都采用了类似的技术。 关键字:零拷贝,顺序写,缓冲区,批量,压缩,分段存储 -顺口溜: -零拷贝,mmp(妈卖批),sendfile 快如🐔 -顺序写,缓冲区,落盘记得要刷新 -批量发,多压缩,一不小心丢数据 -日志多,分段存,内存里面放索引 + #### 类似问题 +- 什么是零拷贝 +- 为什么顺序写那么快? +- Kafka 为什么那么快? +- + +#### 如何引导 - 讨论到了零拷贝技术 +- 讨论到了顺序写技术 ### Kafka 的 ISR 是如何工作的? @@ -173,7 +183,12 @@ MySQL 的主从模式比起来,并没有这种问题,即 MySQL 不需要进 关键字:谁控制,并发竞争 + +### 如何解决 Topic 数量或者 Partition 数量过多的问题? + +### 如何保证消息有序性?方案有什么缺点? + ## References [图解Kafka高可用机制](https://zhuanlan.zhihu.com/p/56440807) [Kafka高性能原理](https://zhuanlan.zhihu.com/p/105509080) -[Kafka与零拷贝](https://zhuanlan.zhihu.com/p/78335525) \ No newline at end of file +[Why Kafka is fast](https://preparingforcodinginterview.wordpress.com/2019/10/04/kafka-3-why-is-kafka-so-fast/) \ No newline at end of file