Kafka 0.8.2 新的offset管理

之前Kafka存在的一个非常大的性能问题(隐患)就是利用ZK来记录各个Consumer Group的消费进度。当然JVM Client帮我们自动做了这些事情,但是Consumer需要和ZK频繁交互,而利用ZK Client API对ZK频繁写入是一个低效的操作,并且从水平扩展性上来讲也存在问题。所以ZK抖一抖,集群吞吐量就跟着一起抖,严重的时候简直抖的停不下来。 当然某些非JVM端的API压根就不把offset存在ZK中,如基于Go的sarama,直接自己维护了一个变量在内存中记录,总之就是问题多多了。所以非JVM的客户端,大家悠着点用。


0.8.2 Kafka引入了一个叫native offset storage的玩意儿,将offset管理从ZK移出,并且可以做到水平扩展。看到这个消息大家基本都泪流满面了。


实现原理其实也很自然,利用了Kafka自己的compacted topic,以consumer group,topic与Partition的组合作为key。所以offset的提交就直接写到上述说的compacted topic中了,但是又由于offset是如此的重要以至于绝逼不能丢数据,所以消息的acking级别(由request.required.acks控制)设置为-1,producer等到所有ISR收到消息后才会得到ack(数据安全性最好,但是速度会有影响)。所以Kafka又在内存中维护了<consumer group,topic,partition>的三元组来维护最新的offset信息,consumer来取最新offset信息的时候直接内存里拿即可。当然,敏锐性强的朋友一定想到了,kafka允许你快速的checkpoint最新的offset信息到磁盘上。


至此,offset这块算是长进了一大步。

你可能感兴趣的:(Kafka 0.8.2 新的offset管理)