zoukankan      html  css  js  c++  java
  • Kafka相关知识点

    Producer: 生产者,发送消息的一方。生产者负责创建消息,然后将其发送到 Kafka。

    Consumer: 消费者,接受消息的一方。消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。

    Consumer Group: 一个消费者组可以包含一个或多个消费者。使用多分区 + 多消费者方式可以极大提高数据下游的处理速度,同一消费组中的消费者不会重复消费消息,同样的,不同消费组中的消费者消息消息时互不影响。Kafka 就是通过消费组的方式来实现消息 P2P 模式和广播模式。

    Broker: 服务代理节点。Broker 是 Kafka 的服务节点,即 Kafka 的服务器。

    Topic: Kafka 中的消息以 Topic 为单位进行划分,生产者将消息发送到特定的 Topic,而消费者负责订阅 Topic 的消息并进行消费。

    Partition: Topic 是一个逻辑的概念,它可以细分为多个分区,每个分区只属于单个主题。同一个主题下不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。

    Offset: offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,Kafka 保证的是分区有序性而不是主题有序性。 Replication: 副本,是 Kafka 保证数据高可用的方式,Kafka 同一 Partition 的数据可以在多 Broker 上存在多个副本,通常只有主副本对外提供读写服务,当主副本所在 broker 崩溃或发生网络异常,Kafka 会在 Controller 的管理下会重新选择新的 Leader 副本对外提供读写服务。

    Record: 实际写入 Kafka 中并可以被读取的消息记录。每个 record 包含了 key、value 和 timestamp。

    副本:Kafka 会为分区的多个副本选举一个作为主副本(Leader),主副本对外提供读写服务,从副本(Follower)实时同步 Leader 的数据,主要也是为了解决一个节点挂掉,导致消息丢失的问题

     kafka怎么解决消息丢失?

    生产端:

    1.producer把消息发送给broker,因为网络抖动,消息没有到达broker,且开发人员无感知。

       producer设置acks参数,消息同步到master之后返回ack信号,否则抛异常使应用程序感知到并在业务中进行重试发送。这种方式一定程度保证了消息的可靠性,producer等待broker确认信号的时延也不高。

    2.producer把消息发送给broker-master,master接收到消息,在未将消息同步给follower之前,挂掉了,且开发人员无感知。

      producer设置acks参数,消息同步到master且同步到所有follower之后返回ack信号,否则抛异常使应用程序感知到并在业务中进行重试发送。这样设置,在更大程度上保证了消息的可靠性,缺点是producer等待broker确认信号的时延比较高。

    3. 某个broker消息尚未从内存缓冲区持久化到磁盘,就挂掉了,这种情况无法通过ack机制感知。

      设置参数,加快消息持久化的频率,能在一定程度上减少这种情况发生的概率。但提高频率自然也会影响性能。

    消费端: 

    1.consumer成功拉取到了消息,consumer挂了。

      设置手动sync,消费成功才提交。

    kafka如何保证消息的顺序?

    kafka的消息在同一个partition中是有序的,所以保证需要顺序的消息在一个partition就行。

    但一个partition只对应一个线程,吞吐量很小

    当多个partition, 可以通过生产端把尽量需要同顺序的消息打入同一个partition,当必须通过多线程消费同一个partition时,就需要通过代码端控制每一个线程维护一个内存队列,相当于再把partition拆分一下,将需要保证顺序的一部分数据打入同一个内存队列

    kafka如何解决重复消费和消息幂等的问题?

    在解决消息丢失时,消费端有确认消费成功才提交,如果消费成功,却在此提交前崩溃,下次启动消费者势必会对提交前的这些数据进行重复消费,需要应用层需要处理这个问题。

    1.通过redis的set来处理

    2.插将每条消息生成一个唯一的ID,消费前判断

    https://juejin.cn/post/6965401216599736351

    https://juejin.cn/post/6999263126713696293

  • 相关阅读:
    Mysql group by语句的优化
    Mysql join语句的优化
    jquery 只读
    【Unity Shaders】Transparency —— 使用渲染队列进行深度排序
    oracle多表查询之内连接,外连接语句总结
    String比较相等的问题探索
    markdown实例
    集合list里存储list,要遍历最底层list的对象元素的遍历方法
    System.out.println(i++); System.out.println(++i);的区别
    windows自动快捷方式
  • 原文地址:https://www.cnblogs.com/peterleee/p/13817479.html
Copyright © 2011-2022 走看看