Kafka的topic为何要分区。面试
消费者组的做用。
markdown
Kafka分区分配。架构
再睁眼的瞬间, 画风竟然变成了植物大战僵尸的样子!!!分布式
下面咱们来讲道说道这有趣的场景:spa
咱们熟悉的消息生产者——天然就是植物大战僵尸中能够生成粮食的植物了。3d
好比生产者豌豆射手:code
他能够发送出普通豌豆(消息)。orm
好比生产者寒冰射手:
游戏
他能够发送出寒冰豌豆(消息)。kafka
再来看看咱们可爱的消费者僵尸,他们能够消耗(消费)生产者发出来的豌豆(消息)。
Kafka炮台支持两种豌豆投递方式。
把消费者僵尸划分红不一样的消费者组,那么就能够实现点对点模式和广播模式。
生产者有不少类型,有普通豌豆射手,有寒冰射手,有火焰射手等等,这些生产者发出来的豌豆就分别对应3个Topic:普通主题,寒冰主题, 火焰主题。
不少不一样类型生产者其实均可以生产普通豌豆,好比二连豌豆,三连豌豆,加特林豌豆(四连发),甚至还有能够五连发的豌豆荚。
若是如今战场上投入一批五连发的豌豆荚!
能够预见的是,将会有巨量的普通豌豆发送到普通主题炮台中,很快这个炮台就会积压不少豌豆发送不出去,而且还有可能由于负载过大而宕机,而与此造成鲜明对比的是,其余主题的炮台倒是处于空闲状态,连一颗寒冰/火焰豌豆都接收不到。
而站在消费组僵尸的角度上看,即便如今新增再多的消费者,也没法加速豌豆的消耗,由于Kafka炮台已经成为吞吐量的瓶颈。
若是咱们让每一个炮台均可以接收多种主题的豌豆, 这样就能够充分利用场上的每个炮台了。这就是主题的分区。
假如如今咱们给普通豌豆主题2个分区, 这2个分区分别分布在两个炮台中。
这样场上全部炮台能够接收普通豌豆子弹,理想状态下,是能够减缓了单一炮台的压力,这就是主题分区的特色之一,分布式存储。
而对于消费者僵尸而言,如今同一时间能够有两个消费者僵尸消耗普通豌豆, 加快了豌豆的消耗速度,这主题分区的另外一个特色,分布式消费。
如今主题有了分区,在得到了不少好处的同时,又必然会引伸出一系列复杂的问题。
全部如今生产者要考虑怎么才能把豌豆均匀地分发给各个Kafka炮台。
在Kafka中,若是生产者有指定分区号,那么消息会直接发往指定的分区。不然会提供默认的分区器DefaultPartitioner,对消息的key进行哈希运算获得分区号。若是消息没有key,那么就会采用轮询的方式给主题下的各个分区发送消息。
如图,若是两个分区的豌豆都由同一个消费者僵尸负责消耗,另外一个消费者将无所事事,这就是消费者分区分配不均的状况。
因此,消费者僵尸也要讨论由哪些僵尸负责消耗哪些分区的豌豆,让每一个僵尸均可以均匀地承受打击。
Kafka提供的消费者分区分配策略有三种,分别是RangeAssignor、RoundRobinAssignor和StickyAssignor。每种策略的具体细节属于僵尸大军中的“高度机密”(面试高频),咱们将在下一篇文章中进行讲解。
思考一下,若是一个生产者把全部豌豆发送给炮台存储后,炮台宕机了,那这批豌豆就丢失了,那怎么才能避免这问题呢?这就是数据的容灾能力问题了。
咱们给每一个主题的分区引入副本的概念。
若是每个分区都有2个副本,副本之间的关系是一个Leader对多个follower。
只有Leader副本才能存储豌豆,其余副本只是同步Leader的数据。
若是Leader宕机了,那么就会在剩下的副本中选出新的Leader。这就实现了故障的自动转移。
Kafka集群在建立主题时,就要考虑分区副本应该分配在哪一个broker上。
而引入副本机制后,与此相关的优先副本选举,副本之间的同步机制等问题又是一次长篇大论了。
ZooKeeper的做用。
分区的有序性。
分区数。
重平衡。