欢迎大家关注 github.com/hsfxuebao/j… ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
1.Producer源码目录
- RecordAccumulator封装消息流程初探
- 把数据写入对应批次(分段加锁)
- 内存池设计
《Kafka源码分析10-Producer终于与Broker建立上连接了》
《Kafka源码分析12-Producer处理粘包拆包完美方案》
《Kafka源码分析13-Producer如何处理暂时状态的响应》
《Kafka源码分析18-如何处理长时间没有接收到响应的消息》
超高并发的网络架构设计:
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源码设计与实现
近期评论