kafka初体验

一、作用

1.1、定义

kafka是一个开源的分布式事件流平台,主要被用于高性能数据管道、流分析、数据集成和关键任务应用。

1.2、作用

1.缓冲、消峰:在瞬时流量过大的时候,服务器一下子处理,可能会导致服务器卡死。而kafka可以在服务器前将数据缓存下来,按照服务器的可处理的速度来处理数据。
2.解耦:两个服务通过kafka建立业务上的联系,实现了两个业务的解耦。
3.异步通信:生产者将消息发送给kafka之后就不需要再管了,降低用户等待时间,同时消费者可以随意选择消费消息的时间,实现异步通信。

二、组成

kafka主要组成部分:producer、consumer、broker。
生产者把消息发送到broker,消费者从broker中拉取消息来消费。
引入broker解决了消息丢失的问题(生产者发送成功,消费者未消费就挂了),但也引入了新问题:
1.如果消费者消费了消息,但是未应答就挂了,重启后会重复消费。
2.性能下降,broker要保持每个消息的好几个状态。
3.如何处理已发送,但是一直没有确认的消息。

三、Producer

3.1、消息发送流程

main线程内,调用send方法,首先经过拦截器,再经过序列化器,最后经过分区器。分区器按照策略将消息分在不同的分区,当分区大小达到batch.size(默认16K)或者超过linger.ms(默认0ms)的时候sender线程就会把消息发送到kafka的broker集群的对应分区上。broker集群收到消息之后向生产者发送确认应答(有的策略需要,有的不需要)。

3.2、acks应答级别

acks=0:生产者发送的消息,无需等待broker应答。可靠性差,效率高。(消息最多一次)
acks=1:生产者发送的消息,leader收到消息之后应答。可靠性中等,效率中等。
acks=-1(all):生产者发送的消息,等待leader和ISR队列的所有节点都收到数据之后再应答。可靠性高,效率较低。
生产环境上,acks=0很少使用,acks=1用于对可靠性要求不是特别高的场景,如普通日志。acks=-1用于传输对数据可靠性要求较高的场景。

0和1的应答级别都存在丢失数据的风险,-1的应答级别,在遇到follower一直没回应的时候也没法应答。因此引入了ISR队列(和leader保持同步的follwer和leader集合),如果follower长时间为何leader同步,就将该follower踢出ISR队列。(消息最少一次,但存在数据重复的风险)
保证数据可靠:acks级别设置为-1,分区副本数和ISR里应答的最小副本数量都大于等于2.

3.3、Topic分区优势

1.合理利用存储资源,每个Partition在一个Broker上存储,数据就能切割成一块一块存储在多个Broker上,可以合理控制分区的任务,实现负载均衡。
2.提高传输效率,消息传输以分区为单位,不同分区互不影响,这样一个Tpoic可以同时有多个分区传输消息。

3.4、消息构造的分区策略

构造消息的类:ProducerRecord(String topic,Integer partition,K key,xxx)
1.指明分区参数的情况下,直接将参数作为分区值。
2.没有指明分区参数但有key参数的情况下,将key的hash值与topic的分区数取余算出分区值。
3.既没有指明分区参数也没有key参数的情况下,使用粘性分区,系统会随机选择一个分区,并尽可以一直使用该分区,直到该分区的batch已满或已完成,则重新随机一个分区使用。(和上一次不同的)
小技巧:生产中,如果要把一个表的数据放到同一个分区里面,一般会用表名来作为key,这样hash算出来的肯定都是同一个分区。(需要确保有序的也可这样)

四、Broker

Broker:一个kafka服务器就是一个Broker。一个集群有多个Broker,一个Broker有多个Topic。
Topic:一个Topic就代表一个队列,生产者和消费者面向的都是一个Topic,一个Topic下面有多个Partiton
Partition:一个大Topic可以分布在多个Broker上,一个Topic可以分为多个Partition,每个Partition都是一个有序的队列。
ISR队列:和leader保持同步的follwer和leader集合
AR队列:kafka分区中所有副本的统称。

broker启动之后会在zookeeper中注册,先注册的controller说了算,负责监听各个节点的变化。controller将节点信息发送到zookeeper中,其他节点从zookeeper中同步消息。

五、Consumer

consumer有consumer group的概念,一个consumer group里面可能存在多个消费者,一个consumer group代表一个逻辑上的订阅者。

topic下面有多个分区,一个分区只能被同一个consumer group里的一个消费者消费。

把topic、consumer group按照整体来看更好理解。topic下面的每个分区都是属于该topic,consumer group下面的每个消费者都属于该consumer group。如果consumer group订阅了topic,为了保证不会重复消费,那么对于一个分区,consumer group里面都只能有且只有一个消费者消费该分区的消息;为了保证不漏消费,topic下面的每个分区都要有消费者消费。也就是说一个消费者可能需要消费一个topic下面的多个分区。

六、常见面试题

6.1、如何确保数据有且只被消费一次?

设置acks=-1,同时设置分区副本数大于等于2,ISR队列应答最小副本数大于等于2,确保数据可靠性。外加producerid+sequenceNum实现幂等性,确保不重复消费。

6.2、kafka如何实现数据幂等性?

1.producer启动的时候向broker申请一个producerID;
2.producer为发出的每条消息绑定一个sequenceNum(消息顺序);
3.kafka的broker节点收到消息时会以producerID为单位存储sequenceNum;
4.当producer重复发送了,broker节点也会将重复的消息过滤掉;
5.当producer发送的消息无序抵达broker,broker节点也可以根据 <produceID,sequenceNum>将无序列表转换成有序列表。

6.3、生产者如何提升吞吐量?

可以通过配置批次大小和延迟时间,以及对消息进行压缩,设置缓冲区大小来提升吞吐量。

6.4、ISR选举方式

当leader挂了之后,controller监听到节点变化,就获取ISR,选举新的leader。选举方式时在ISR中存活为前提,按照AR中排在前面的优先原则。

6.5、kafka采用推流还是拉流?

1.生产者和broker之间采用推流的方式,生产者主动将消息发送给broker。broker和消费者之间采用拉流的方式,消费者主动从broker中拉取消息。
2.生产者采用推流的方式,是因为系统不知道producer什么时候会发消息,如果broker一直探测也会造成性能浪费。
3.消费采用拉流,可以让各个消费者充分利用自身机器的性能,根据自身机器性能来决定拉起消息的速率。如果采用推流,没法协调不同消费者。速度太快,部分机器处理不了,速率太慢,部分机器性能浪费。

6.6、如何保证数据有序性

1.kafka只保证分区内的数据是有序的。因此可以考虑一个topic只创建一个分区.
2.可以给消息指定相同topic和分区,这样可以保证消息的有序性。
3.如果不传分区参数,也可以指定key,使用相同的key也可以保证消息的有序性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值