
Kafka目前总共演进了7个大版本,分别是0.7、0.8、0.9、0.10、0.11、1.0和2.0,其中的小版本和Patch版本很多。如果你要向架构师转型或者已然是架构师,那么这些都是能够帮助你进行技术选型、架构评估的重要依据。
我们先从0.7版本说起,实际上也没什么可说的,这是最早开源时的"上古"版本了,这个版本只提供了最基础的消息队列功能,甚至连副本机制都没有
Kafka从0.7时代演进到0.8之后正式引入了副本机制,至此Kafka成为了一个真正意义上完备的分布式高可靠消息队列解决方案。有了副本备份机制,Kafka就能够比较好地做到消息无丢失。那时候生产和消费消息使用的还是老版本的客户端API,所谓的老版本是指当你用它们的API开发生产者和消费者应用时,你需要指定ZooKeeper的地址而非Broker的地址
- 老版本客户端有很多的问题,特别是生产者API,它默认使用同步方式发送消息,可以想见其吞吐量一定不会太高。虽然它也支持异步的方式,但实际场景中可能会造成消息的丢失,因此0.8.2.0版本社区引入了新版本Producer API,即需要指定Broker地址的Producer。
社区正式发布了0.9.0.0版本。在我看来这是一个重量级的大版本更迭,0.9大版本增加了基础的安全认证/权限功能,同时使用Java重写了新版本消费者API,另外还引入了Kafka Connect组件用于实现高性能的数据抽取。新版本Producer API在这个版本中算比较稳定了。
0.10.0.0是里程碑式的大版本,因为该版本引入了Kafka Streams 。从这个版本起,Kafka正式升级成分布式流处理平台,虽然此时的Kafka Streams还基本不能线上部署使用。0.10大版本包含两个小版本:0.10.1和0.10.2,它们的主要功能变更都是在Kafka Streams组件上。如果你把Kafka用作消息引擎,实际上该版本并没有太多的功能提升。不过在我的印象中自0.10.2.2版本起,新版本Consumer API算是比较稳定了。如果你依然在使用0.10大版本,我强烈建议你至少升级到0.10.2.2然后使用新版本Consumer API。还有个事情不得不提,0.10.2.2修复了一个可能导致Producer性能降低的Bug。基于性能的缘故你也应该升级到0.10.2.2。
在2017年6月,社区发布了0.11.0.0版本,引入了两个重量级的功能变更:一个是提供幂等性Producer API以及事务(Transaction) API;另一个是对Kafka消息格式做了重构。
-
前一个好像更加吸引眼球一些,毕竟Producer实现幂等性以及支持事务都是Kafka实现流处理结果正确性的基石。没有它们,Kafka Streams在做流处理时无法向批处理那样保证结果的正确性。当然同样是由于刚推出,此时的事务API有一些Bug,不算十分稳定。另外事务API主要是为Kafka Streams应用服务的,实际使用场景中用户利用事务API自行编写程序的成功案例并不多见。
-
第二个重磅改进是消息格式的变化。虽然它对用户是透明的,但是它带来的深远影响将一直持续。因为格式变更引起消息格式转换而导致的性能问题在生产环境中屡见不鲜,所以你一定要谨慎对待0.11版本的这个变化。不得不说的是,这个版本中各个大功能组件都变得非常稳定了,国内该版本的用户也很多,应该算是目前最主流的版本之一了。也正是因为这个缘故,社区为0.11大版本特意推出了3个Patch版本,足见它的受欢迎程度。我的建议是,如果你对1.0版本是否适用于线上环境依然感到困惑,那么至少将你的环境升级到0.11.0.3,因为这个版本的消息引擎功能已经非常完善了。
最后还有个建议,不论你用的是哪个版本,都请尽量保持服务器端版本和客户端版本一致,否则你将损失很多Kafka为你提供的性能优化收益。