1、Kafka是什么?
Kafka是高级消息队列,也可以做流处理平台
Kafka主要有两大应用场景:
消息队列:建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。
数据处理:构建实时的流数据处理程序来转换或处理数据流。
2、和其他消息队列对比,Kafka的优势在哪?
相对于RocketMQ、RabbitMQ,它主要有以下优势:
极致的性能:基于Scala和Java语言开发,设计中大量使用了批量处理和异步的思想,最高每秒可以处理千万级别的消息。
生态:Kafka的社区对比其他消息队列的更活跃,兼容性更好。
3、什么是Producer、Consumer、Broker、Topic、Partition?
Producer:生产者;即产生消息的一方。
Consumer:消费者;即消费消息的一方。
Broker:代理;可以看做成是一个独立的Kafka实例。多个Kafka Broker组成一个Kafka Cluster。
Topic:主题;在Kafka里topic是一个虚拟的对象,多个Partition可以放置在Topic里。Producer可以指定主题发送,消费者也可以订阅特定的主题来消费消息。
Partition:分区;消息在同一个Partition是顺序执行的。同一个Topic下的Partition可以分布在不同的Broker上,即Topic可以横跨多个Broker。
4、Kafka多副本机制了解吗?
Kafka的Partition引入了多副本机制,即写入操作只会执行在Leader,而Follower是从Leader里拉去消息进行同步。
即生产者和消费者只与Leader交互,Follower只是Leader的副本拷贝。当Leader副本发生故障时会从Follower中选举出一个Leader,但是Follower的offset与Leader的offset相差太大则不允许参与Leader选举。
5、Kafka的多分区(Partition)以及多副本(Replica)机制有什么好处呢?
Kafka通过给特定的Topic指定多个Partition,而各个Partition可以分布在不同的Broker上,这样便能提供比较好的并发能力。
Partition可以指定对应的Replica数,这也是为了高可用,提高了容灾能力。
6、Kafka如何保证消息的消费顺序?
Kafka中同一个Partition的消息顺序是有序的,Kafka是通过offset来保证消息在分区内消息的顺序性,所以我们在生产消息的时候可以指定发送同一个Partition。
但是这样就违背了Kafka设计初衷。
第二种方法就是用OrderId或者UserId然后除以Partition数量进行取模。得出Partition数后发送给Kafka,这样就能保证发送到同个Partition,保证了消息顺序。
7、Kafka如何保证消息不丢失?
Kafka消息丢失分为两种情况,一种是生产者消息丢失,另外一种是消费者消息丢失。
生产者消息丢失:Producer在send消息到Kafka的时候,是异步的一个操作。可以在send完之后get一下,使其变成一个同步操作。
消费者消息丢失:默认情况下,Kafka会自动提交offset,如果在获取消息的时候,突然程序挂掉了,那Kafka也会自动提交offset。所以可以改成手动提交offset,但是手动提交offset也有会重复消费的问题,即获取完消息之后,程序down了,这时候offset就提交不了,下次获取消息还会获取到该offset的消息。