Kafka源码分析20-Producer源码总结

欢迎大家关注 github.com/hsfxuebao/j… ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈

1.Producer源码目录

《Kafka源码分析0-高性能架构》

《Kafka源码分析1-环境准备》

《Kafka源码分析2-Producer初始化》

《Kafka源码分析3-Producer核心流程分析》

  • RecordAccumulator封装消息流程初探

  • 把数据写入对应批次(分段加锁)

  • 内存池设计

《Kafka源码分析4-元数据更新》

《Kafka源码分析5-Sender流程初探》

《Kafka源码分析6-一个batch什么条件可以发送》

《Kafka源码分析7-筛选可以发送消息的Broker》

《Kafka源码分析8-kafka网络设计》

《Kafka源码分析9-若网络没建立好会发送消息吗》

《Kafka源码分析10-Producer终于与Broker建立上连接了》

《Kafka源码分析11-Producer终于发送请求了》

《Kafka源码分析12-Producer处理粘包拆包完美方案》

《Kafka源码分析13-Producer如何处理暂时状态的响应》

《Kafka源码分析14-如何处理响应消息》

《Kafka源码分析15-消息发送完了内存怎么处理》

《Kafka源码分析16-消息有异常怎么处理》

《Kafka源码分析17-如何处理超时的批次》

《Kafka源码分析18-如何处理长时间没有接收到响应的消息》

《Kafka源码分析19-Producer常用配置参数》

超高并发的网络架构设计:

2.总结:

(1)Kafka的网络部分的设计绝对是一个亮点,Kafka自己基于NIO封装了一套自己的网络框架,支持一个客户端与多个Broker建立连接。

(2)处理拆包和粘包的的思路和代码,绝对是教科书级别的,大家可以把代码复制粘贴下来直接用到自己的线上的项目去。

(3)RecordAccumulator封装消息的batchs,使用的自己封装的数据结构CopyOnWriteMap,采用读写分离的思想,用来面对高并发的场景(读多,写少) 提升整个流程的性能。

(4)同时封装消息的时候设计的内存缓冲池,这极大的减少了GC的次数。我们java的项目,最怕最怕的就是GCjava项目60%的问题都是GC引起的。

(5)如果大家还记得RecordAccumulator封装批次时候的代码的话,里面封装批次的时候代码采用的是分段加锁的思想,极大的提高了性能,看得出来作者确实编程功底很深厚。可以不用加锁的地方,就不加锁,只在必须加锁的地方加锁。尽可能的去提升代码的性能,或者说是减少锁的使用的。因为一旦我们在代码里面使用了锁以后:1. 死锁2. 锁争用

(6)其实我个人感觉Kafka的异常体系也是设计得比较清晰的,在核心流程捕获异常,底层抛异常。如果编程经验少一些的同学可以学习借鉴一下。

(7) 生产者去发送数据的时候提供了两个方案:1. 同步发送:性能会差2. 异步发送:里面结合回调函数,很大的提升了kafka的性能。如果我们自己去设计一个系统,这样设计思路也是值得大家去学习的。

参考文档:

史上最详细kafka源码注释(kafka-0.10.2.0-src)

kafka技术内幕-图文详解Kafka源码设计与实现

Kafka 源码分析系列