定义
传统定义
kafka是一个分布式的基于发布/定于模式的消息队列,主要应用于大数据实时处理领域。
发布/订阅
消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类型,订阅者只接受感兴趣的消息。
最新定义
kafka是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、解决生产消息和消费消息的处理速度不一致的情况。
应用场景
解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
异步通信
允许用户把一个消息放入队列,但并不立即处理它。然后再需要的时候再去处理他们。
消息队列的两种模式
点对点模式
消费后删除、一个主题、一个消费者
发布/订阅模式
不删除数据、多个主题、多个消费者
消费方式
poll(拉取)模式
consumer采用从broker中主动拉取数据,kafka采用这种模式。
push(推送)模式
kafka没有采用这种模式。因为由于broker决定消息发送速率,很难使用所有消费者的消费速率,如推送的速度是50M/s,consumer1,consumer2就来不及处理消费(consumer1处理速度为10M/s,consumer2处理速度为20M/s)。
poll模式不足之处:如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据。
每个消费者都会和coordinator保持心跳(默认3s),一旦超时(session.timeout.ms=45s 默认),该消费者会被一出,并触发再平衡;或者消费者处理消息的时间过长(max.poll.interval.ms=5分钟 默认)也会触发再平衡。
kafka不处理数据,只存储数据,数据尽在生产者、消费者端的拦截器(interceptors)中进行处理。
消费者组
在消费者API代码中必须配置消费者组ID,命令行启动消费者不填写消费者组ID会被自动填写随机的消费者组ID。
- 一个consumer group中有多个consumer组成,一个topic有多个partition组成。现在问题是,到底由哪个consumer来消费哪个partition数据。
- kafka有4种主流的分区分配策略:Range、RoundRobin、Sticky、CooperativeSticky。可以通过配置参数partition.assignment.strategy修改翻去的分配策略。默认策略是Range+CooperativeSticky。kafka可以同时使用多个分区分配策略。
分区分配策略
Range是对每个topic而言的
首先对同一个topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。
通过partition数/consumer数来决定每个消费者应该消费几个分区,如果除不尽,则前面几个消费者会多消费1个分区。
注意:如果只是针对1个topic而言,C0消费者多消费1个分区影响不是很大,但是如果有N多个topic,那么针对每个topic,消费者C0都将多消费1个分区,topic越多,C0消费的分区会比其他消费者明显多N个分区。容易引起数据倾斜!!
分区在命令行修改是,只能增加,不能减少!!
Range策略下,若某一消费者挂了,则45s内无其他消费者接替,45s之后此部分数据将全部交由另一个消费者消费。例:C1会消费5个分区数据(总7个分区,C0挂掉),45s之后会触发再平衡(即C1消费4个分区,C2消费3个分区)。
RoundRobin针对集群中所有topic而言
RoundRobin轮询分区策略,是吧所有的partition和所有的consumer都列出来,然后按照hashcode进行排序,最后通过轮询算法来分配partition给到各个消费者。
在RoundRobin策略下,若C0挂掉,则45s内无其他消费者接替,45s以后,这部分数据扔按轮询算法由其他消费者接替(即C1分配2个,C2分配1个)。企业中应用较多。
Sticky
粘性分区的定义:可以理解为分配的结果带有“粘性的”,即在执行一次新的分配之前,考虑上一次分配的结果,尽量少的调整分配的变动,可以节省大量开销。
从kafka 0.11.x版本开始引入这种分配测了,首先会尽量均衡的放置分区到消费者上面,在出现同一消费者组内消费者出现问题时,会尽量保持原有分配的分区不变化。若其中一个消费者挂掉,45s后按粘性消费此部分数据。45s触发再平衡后,会保持原来的分配不变,将新的需要分配的分区粘性分配。
偏移量offset
消费者offset默认维护位置:
0.9版本开始,consumer默认将offset保存在kafka一个内置的topic中,该topic为_consumer_offsets。
0.9版本之前,存在zookeeper中,主要考虑通讯网络上的压力。
指定offset消费
auto.offset.reset=earliest|latest(默认)|none。
- earliest:自动将偏移量重置为最早的偏移量--from-beginning。
- latest(默认值):自动将偏移量重置为最新偏移量。
- none:如果未找到消费者组的先前偏移量,则向消费者抛出异常。
指定时间消费
将时间转化为offset。
漏消费与重复消费(如何保证精确一次性消费)
解决方法:事务,要求下游支持事务回滚。
生产者部分设置幂等。
事务:生产端→集群(broker)→消费者→计算框架
数据积压
- 增加分区,增加消费者个数。
- 生产端→集群(broker),设置4个参数以提高吞吐量。
- 消费端,2个参数:50m,500条。
kafka-eagle即efak
将监控信息传入db,一般用mysql。
kafka-kraft模式(架构)
2.8.0版本以后出现的新特性。
启动与之前不用,需要导kraft目录下。
kafka外部集成
可集成flume,flink,spark,springboot,mqtt等。