Apache Kafka 0.11版本新功能简介

Apache Kafka近日推出0.11版本。这是一个里程碑式的大版本,特别是Kafka从这个版本开始支持“exactly-once”语义(下称EOS, exactly-once semantics)。本文简要介绍一下0.11版本主要的功能变动,下面中的每一项都值得专门写篇文章好好聊聊。算法

1、修改unclean.leader.election.enabled默认值

Kafka社区终于下定决心要把这个参数的默认值改为false,即再也不容许出现unclean leader选举的状况,在正确性和高可用性之间选择了前者。若是依然要启用它,用户须要显式地在server.properties中设置这个参数=trueapache

2、确保offsets.topic.replication.factor参数被正确应用

__consumer_offsets这个topic是Kafka自动建立的,在建立的时候若是集群broker数<offsets.topic.replication.factor,原先的版本取其小者,但这会违背用户设置该参数的初衷。所以在0.11版本中这个参数会被强制遵照,若是不知足该参数设定的值,会抛出GROUP_COORDINATOR_NOT_AVAILABLE。网络

3、优化了对Snappy压缩的支持

以前因为源代码中硬编码了block size,使得producer使用Snappy时的表现比LZ4相差不少,但其实Snappy和LZ4二者之差距不该该很大。故此0.11版本中对Snappy的默认block size作了调整。不过这一点须要详尽的性能测试报告来证实此改动是有效的。数据结构

4、消息增长头部信息(Header)

Record增长了Header,每一个header是一个KV存储。具体的header设计参见KIP-82多线程

5、空消费者组延时rebalance

为了缩短多consumer首次rebalance的时间,增长了“group.initial.rebalance.delay.ms”用于设置group开启rebalance的延时时间。这段延时期间容许更多的consumer加入组,避免没必要要的JoinGroup与SyncGroup之间的切换。固然凡事都是trade-off,引入这个必然带来消费延时。app

6、消息格式变动

增长最新的magic值:2。增长了header信息。同时为了支持幂等producer和EOS,增长一些与事务相关的字段,使得单个record数据结构体积增长。但由于优化了RecordBatch使得整个batch所占体积反而减小,进一步下降了网络IO开销。框架

7、新的分配算法:StickyAssignor

比range和round-robin更加平衡的分配算法。指定partition.assignment.strategy = org.apache.kafka.clients.consumer.StickyAssignor能够尝尝鲜。不过根据个人经验,分配不均匀的状况一般发生在每一个consumer订阅topic差异很大的时候。好比consumer1订阅topic1, topic2, topic4, consumer2订阅topic3, topic4这种状况ide

8、controller重设计

Controller原来的设计很是复杂,使得社区里面的人几乎不敢改动controller代码。老版本controller的主要问题在我看来有2个:1.  controller须要执行1,2,3,4,5,6步操做,假若第3步出错了,没法回滚前两步的操做;2. 多线程访问,多个线程同时访问Controller上下文信息。0.11版本部分重构了controller,采用了单线程+基于事件队列的方式。具体效果我们拭目以待吧~~性能

9、支持EOS

0.11最重要的功能,没有之一!EOS是流式处理实现正确性的基石。主流的流式处理框架基本都支持EOS(如Storm Trident, Spark Streaming, Flink),Kafka streams确定也要支持的。0.11版本经过3个大的改动支持EOS:1.幂等的producer(这也是千呼万唤始出来的功能);2. 支持事务;3. 支持EOS的流式处理(保证读-处理-写全链路的EOS)测试

相关文章
相关标签/搜索