在kafka中,新版本api主要是针对java版本的producer和consumer。
Producer
新版本的Producer,相对于旧版本而言,在设计理念上具有以下优势:
- 发送过程被划分到两个不同的线程:用户主线程和Sender I/O线程,逻辑更加容易把控。
- 完全异步发送消息,并提供回掉机制(callback)用于判断发送成功与否。
- 分批机制(batching),每个批次中包括多个发送请求,提升整体吞吐量。
- 更加合理的分区策略:对于没有指定key的消息而言,旧版本Producer分区策略是默认在一段时间内将消息发送到固定的分区,这容易造成数据倾斜(skewed);新版本采用轮询方式,消息发送将更加均匀。
- 底层统一使用基于Java的Selector的网络客户端,结合Java的Future实现更加健壮和优雅的生命周期管理。
Consumer
新版本的Consumer,相对于旧版本而言,在设计上的突出优势如下:
- 单线程设计——单个consumer线程可以管理多个分区的消费Socket连接,极大地简化了视线。虽然在0.10.1.0版本中额外引入了一个后台心跳线程(background hearbeat thread),不过双线程的设计依然比旧版本consumer鱼龙混杂的多线程设计简单得多。
- 位移提交和保存交由Kafka来处理——位移不再保存到zookeeper中,而是单独保存在Kafka的一个内部的topic中,这种设计即避免了Zookeeper的频繁读/写的性能瓶颈,同时在Kafka的内部的备份机制天然地视线了位移的高可用管理。
- 消费者组的集中式管理——上面提到了Zookeeper要管理位移,其实它还负责管理整个消费者组(consumer group)的成员。者进一步加重了对于zookeeper的依赖。新版本consumer改进了这种设计,实现了一个集中式协调者(corrdinator)的角色。所有组成员的管理都交由该coordinator负责,因此对于group的管理将更加可控。