Kafka实现原理阅读笔记
设计理念 持久化 尽量线性的读写磁盘。一个硬盘的顺序读写速度一般是4k读写的千倍以上。线性的读写是可以被预测,也能被操作系统大幅的优化的。 以pagecache为中心的设计风格,使用文件系统并依赖于pagecache要优于维护内存中缓存或其他结构。一方面避免 JVM 中的 gc带来的性能损耗。同时简化了代码实现。 持久化队列,只需要简单的在文件后面追加写入即可。而不用考虑建立一个索引文件(BTree)。查询和写入的复杂度由 BTree的 O(logN) 减小为线性的 O(1)。大幅提升数据的吞吐量,有利于处理海量数据,且对存储系统的性能要求不高,降低成本。 考虑将多条消息聚合在一次。减少平均每条消息的开销。 使用 zero-copy 减少字符拷贝时候的开销。 开启压缩协议,减少数据所占的空间。 生产者 (Producer) Producer 向 Leader Partition 发送消息。 Producer 可以向任何一个 Partition 询问整个集群的状态,以及谁是 Leader Partition Producer 自己决定写入到哪个 Partition。Producer 可以考虑使用何种负载的策略。随机,轮询,按照key分区都可以。 支持批量操作。消息攒够一定数量再发送,使用适当的延迟换来更高的数据吞吐量。 消费者 (Consumer) 消费者直接向 Leader