Kafka学习笔记

136 阅读6分钟
  • MQ消息使用场景,解决了什么问题

    所有的MQ消息,都是有一些通用的特点,和使用场景,大体分为以下三种场景,如果你的交互需要返回值,或是必须使用同步的情况下是不适合MQ消息的

    • 削峰

      A系统创建订单后,需要通知B系统,A系统每分钟会创建100个订单,但是B系统每分钟只能处理10个订单创建的请求,如果用接口方式,对B系统不友好,B系统处理能力反向影响到A系统,如果采用MQ消息方式,A系统为生产者,B系统为消费者,B系统可以采用pull模式,根据自己实际处理能力和节奏进行消费

    • 异步

      上个例子中,如果用接口,A系统会等待B系统接口执行完才能进行后面的操作,但是MQ消息可以使A不用等待B系统执行完,就可以进行后面的逻辑处理,同步变异步,提升了A系统的性能

    • 解耦

      采用接口方式

      • A创建订单,A调用B
      • A创建订单,A调用B,A调用C
      • A创建订单,A调用B,A调用C,A调用D

      上面是几种迭代过程,根据业务不同变化,在A里面需要调用各个系统的接口,这样A系统创建订单就会和依赖方产生耦合,每次需求变更,都要在A系统里修改调用不同系统的接口

      采用MQ消息方式

      • A创建订单,B订阅
      • A创建订单,B订阅,C订阅
      • A创建订单,B订阅,C订阅,D订阅

      此种场景下,A创建完订单后,始终只发送了一个订单创建的消息,哪个系统需要订单创建的通知,自己去订阅消息就可以了,把订单创建,和监听订单创建,通过MQ消息进行解耦

  • 基本概念

    img

    • Producer

      生产者,也就是发送消息的一方。生产者负责创建消息,然后将其投递到 Kafka 中

    • Consumer

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

    • Broker

      服务代理节点。对于 Kafka 而言,Broker 可以简单地看作一个独立的 Kafka 服务节点或 Kafka 服务实例。大多数情况下也可以将 Broker 看作一台 Kafka 服务器,前提是这台服务器上只部署了一个 Kafka 实例。一个或多个 Broker 组成了一个 Kafka 集群。一般而言,我们更习惯使用首字母小写的 broker 来表示服务代理节点。

    • Topic & Partition

      KafKa 中按照 Topic(主题)进行归类,生产者将消息发送到特定的主题,消费者进行订阅主题进行消费。主题是逻辑上的概念,一个消息对应一个主题,一个主题会对应一个或多个 Partition(分区),一个分区只属于单个主题,同一个主题下的不同分区包含的消息是不同的,分区在存储层面对应一个可追加日志文件,消息写入会被追加到日志文件,并会分配一个特定的偏移量(offset)

      offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,Kafka 保证的是分区有序而不是主题有序。

      消费发送到broker之前,根据分区规则选择发送和存储到对应的分区,分区规则合理的话,所有消息都可以均匀的分配到不同的分区,如果一个主题只对应一个分区文件,那么这个文件所在的机器I/O将会成为这个主题的性能瓶颈,为解决此问题,创建主题时可指定分区数量,也可创建完主题之后进行修改,通过修改分区数量,进行水平扩展

      • 多分区的好处,生产者,和消费者看都是有好处的,如果为一个,单个文件IO成为瓶颈,消费者无法并发消费 TODO
    • ZooKeeper

      ZooKeeper 是 Kafka 用来负责集群元数据的管理、控制器的选举等操作的

    • 分区多副本(Replica)机制

      Kafka 为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。同一分区,不同副本中保存的是相同的消息(同一时刻,并不是完全相同),副本之间是一主多从关系,leader副本负责读写,follower副本只负责与leader副本进行消息同步,副本处于不同的broker中,当leader副本发生故障,会从follower副本中选举新的leader副本,实现了故障自动转移,保证了当单个broker出现故障,仍然保证服务可用

      img

      • AR(Assigned Replicas)

      分区中所有副本统称AR(AR=ISR+OSR)

      • ISR(In-Sync Replicas)

        指与leader副本保持一定程度同步的副本(包含leader副本),这里指的“一定程度” 可通过参数进行配置,leader副本负责维护和跟踪ISR集合 follower副本滞后状态,当出现 follower副本滞后过多或失效,leader副本会把它从ISR集合中剔除,OSR中的 follower副本同步状态追上 leader副本,则将其从OSR中转移至ISR中,leader副本发生故障,会从ISR中选取一个新的 leader,Kafka 使用的这种 ISR 的方式则有效地权衡了数据可靠性和性能之间的关系。

      • OSR(Out-of-Sync Replicas)

        指与leader副本同步滞后过多的副本

      • HW(High Watermark)高水位

        HW为特定偏移量,消费者可消费HW之前的消息,ISR中最小的LEO为分区中的HW

      • LEO(Log End Offset)

        日志文件中下一条待写入消息的 offset

        img

      • HW & LEO关系

        • 消息3,消息4写入leader,还没有同步到任何一个follower,此时HW和LEO都为3,表示消费者可以消费3之前的消息

          img

        • 某一时刻,消息3,消息4已同步至 follower1,消息3同步至 follower2,leader 的 LEO为5,follower1 的 LEO为5,follower2 的 LEO为4,那么此时,分区 HW为4,消费者可消费 offset为 0 到 3之间的消息

          img

        • 所有副本都同步了消息3,和消息4,HW和LEO都为5

          img