Kafka3.0.0版学习笔记

定义

传统定义

    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。
    1. 一个consumer group中有多个consumer组成,一个topic有多个partition组成。现在问题是,到底由哪个consumer来消费哪个partition数据。
    2. 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。
    1. earliest:自动将偏移量重置为最早的偏移量--from-beginning。
    2. latest(默认值):自动将偏移量重置为最新偏移量。
    3. none:如果未找到消费者组的先前偏移量,则向消费者抛出异常。

指定时间消费

    将时间转化为offset。

漏消费与重复消费(如何保证精确一次性消费)

    解决方法:事务,要求下游支持事务回滚。
    生产者部分设置幂等。
    事务:生产端→集群(broker)→消费者→计算框架

数据积压

    1. 增加分区,增加消费者个数。
    2. 生产端→集群(broker),设置4个参数以提高吞吐量。
    3. 消费端,2个参数:50m,500条。

kafka-eagle即efak

    将监控信息传入db,一般用mysql。

kafka-kraft模式(架构)

    2.8.0版本以后出现的新特性。
    启动与之前不用,需要导kraft目录下。

kafka外部集成

    可集成flume,flink,spark,springboot,mqtt等。

数据流向:生产者→kafka集群→消费者。

2.8.0版本开始可以不用依赖zookeeper。

posted on   saihao  阅读(261)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示