现在你已经看完kafka,可以问自己如下几个问题,看自己掌握得如何
- 为什么选择kafka而不是其他JMS?其优势是什么,应用场景有哪些
易上手,吞吐量高
2.你的业务真的需要kafka吗?
使用kafka会带来运维成本,如果你的业务数据量小到可以不用kafka时,就不用kafka。比如你的系统就几个用户使用,然后你用kafka实现一个异步短信功能给,给他们发短信,那就有点杀鸡用牛刀了
3. kafka会不会数据丢失?比如集群中有些机器当机了这种情况
对于数据提交,只要有足够的broker节点,且ack设置为大于1,基本就不会有数据丢失。如果ack小于等于1,kafka是采用异步提交,此时数据会丢失,但是能很大地提高kafka的吞吐量。另外一些极端情况可能会导致数据丢失,比如ack=3,但此时broker因为当机只剩下2个,此时数据无法写入,而如果broker全部挂掉,此时数据就会丢失,这种情况是可能发生的,比如所有kafka在同一个机房,而机房在某一时刻断电了,所以当可靠性要求很高的情况下,应考虑kafka跨机房部署
对于数据消费,如果要保证consumer的exactly-once语义,就要使用事务型producer,或2阶段提交协议
4. 为什么说kafka快
参考kafka高性能内幕一节
5. 如果consumer当机了会发生什么?如果当机后又连接回来了,又会发生什么?主要了解再均衡机制以及有组消费者和无组的消费者
对于有组消费者,这得看消费者组的设置了。如果消费者组内的消费者数大于分区,且当机的consumer并没有消费分区数据,此时当机几乎没啥影响,新增消费者也几乎没啥影响。如果消费者组内消费者数小于分区数,此时consumer当机或有新的consumer加入,都会触发再均衡
对于无组消费者,因为无组,所以自己给自己分配分区和消费分区内的数据,所以无法增加消费者,因为无组。如果当机,也不会发生再均衡,因为从头到尾,就只有一个消费者
6. consumer组是怎么实现组内负载均衡的
当consumer掉线且该consumer原本处理分区数据,而不是闲置的,或增加consumer且consumer数小于分区数,都会触发再均衡,从而实现组内负载均衡
7. kafka broker集群怎么确定节点是否存活
参考复制一节
8. kafka读写分离
kafka没有读写分离,原因参考相关小节
9. kafka怎么进行集群故障转移
如果leader当机,通常kafka会从follower中选一个作为leader,通常是从ISR中选,因为ISR中的follower是跟leader保持同步的。
如果follower当机,通常没啥问题,但可能会有警告。当存活的follower+leader的数量小于ack,可能会禁止数据写入
10. kafka主从数据是怎么保持一致的,也就是如果一个follower掉线,过了一段时间又回来了,那这个follower会跟leader保持一致吗
不会。follower实际上也是consumer,专门用于拉取和存储leader数据。所以follower回来后,会自动从leader拉取数据,直至保持同步
11. 分区是怎么分布到集群中的节点的?
假设集群中有2个主从集群,则每个主从集群均匀分到分区。如果分区数大于2,此时显然多了一个分区,那这个多出分区怎么处理?能新加入一个主从集群吗?
多出的分区会随机存在于其中一个broker。当加入一个新机器,此时分区不会自动分到新的broker(新的版本可能会改进这点也不一定),然后可以使用重新分区工具进行重新分区
12. kafka怎么扩容缩容,另外topic能动态进行分区吗
参考kafka集群扩容缩容一节。topic可以使用重新分区工具来重新分区
13. kafka能动态增加follower吗
kafka新建topic时,自动会有一个分区成为leader,另一些为follower。分区数在新建topic时就指定了,但可以用重新分区工具修改。
14. 生产者发送数据,如果broker当机了,会不会一直重复发
这个得看配置,默认配置通常是重试1次或3次,你也可以自己进行配置,或在自己的java代码中去处理