kafka 概述

概览

  • kafka解决的问题
  • 主题
    • 分区
    • 消息
  • 生产者
  • broker
    • broker集群
  • 消费者
    • 消费者组群
    • 生产者分区和消费者群组
  • 消息可靠性
  • 消息系统
    • 队列和广播
    • 消息保序
  • 存储系统
  • 流处理
  • 整合
  • 应用场景
  • api分类

kafka解决的问题

  • 生产者种类多,数据格式不同,数据源众多,消费者种类多:使用生产者和消费者模式进行解耦
  • 消费者无法依据自身处理情况轮询拉取数据:提供数据持久化,按需取消息
  • 消息系统无法横向扩展:系统随流量进行很想水平扩展,使用消息批次加压缩的模式提高消息传输效率

主题

  • 通过主题对消息进行分类
  • 可配置项
    • partition:分区数
    • 设置日志保留的时间、每个分区保留的日志大小
    • 每个日志片段的大小,多长时间关闭一个片段
    • 单个消息的大小

分区

  • 一个主题的日志被分割成了多个分区
  • 消息以追加的方式写入分区,先进先出的队列模式
  • 分区可以在不同的服务器上
  • 一个分区可以分配到一个或者多个broker上。其中一个为分区首领,其他为副本分区(提高可靠性)
  • 首领副本:负责和生产者消费者进行交互;副本:从首领处拷贝保持同步
  • 每个分区上的记录都是保序的,分区会给每个记录一个id,也就是offset
  • 每个分区会保留特定时间或者特定大小的数据

消息

  • 包含:主题、分区、消息建、消息

生产者

  • 生产者会决定发送消息的主题和分区(可以依靠平均分发,也可以依靠特定的字段)
  • 如果没有消息键生产者将消息均匀的分配到不同的分区上
  • 如果有消息键,同一个消息键的消息写入相同的分区,用户可以自定义分区器
    来源于网络
  • 配置项
    • 配置broker的地址
    • 键、值的序列化类
    • 缓冲区大小
    • 生产者在收到服务器响应前可以发送多少个消息(消息保序的关键,一次只发一个消息给broker,确保每个消息都能收到)

消费者

  • 消费者可以再不同的机器上
  • 为每一个分区维护一个offset,记录读取消息的位置,位置记录在zk中
  • 消费者是可以调整offset来获取想要的任意未被删除的数据
  • 通过订阅主题,主动拉取消息offset
  • 配置项:
    • 是否自动提交
    • 指定分区分配策略
    • 在offset无效时读取的策略
      这里写图片描述

再均衡监听器

  • 通过监听,在发生在均衡的时候可以关闭一些资源(数据库),提交offset

消费者组群

  • 包含一个或者多个消费者
  • 群组保证每个主题分区只能被一个消费者消费
  • 每个群组会消费每个主题的所有分区
  • 如果所有的消费者有相同的分组,监听同一个主题,消息只会分发给一个消费者
  • 如果所有的消费者有不同的分组,监听同一个主题,消息会广播给所有的消费者

生产者分区和消费者群组

  • 一个主题的分区数量<消费者群组的消费者数量,有消费者空闲
  • 一个主题的分区数量=消费者群组的消费者数量,一个消费者对应一个分区
  • 一个主题的分区数量>消费者群组的消费者数量,多个分区的消息在一个消费者上处理
  • 如果想要主题上所有的消息都保序,可以让主题只有一个分区,但是这样将只有一个消费者消费,失去扩展性
    这里写图片描述

broker

  • kafka服务端,用来存放生产者产生的数据,为数据设置偏移量
  • 响应消费者读取数据的请求
  • broker的数据不会立刻消失
    • 配置主题保留一段时间或者一定文件大小的数据
    • 配置主题仅保留最后一个带有特定键的消息
  • 配置:
    • id:集群中唯一的id
    • port:kafka的port
    • zk地址
    • log.dirs:存放日志的位置
    • 设置初始化时的线程数:和启动速度有关
    • 创建主题的时机

broker集群

  • 第一步选举出一个broker作为控制器
  • 将一个分区分为leader和follower,分配到不同的broker上。(目的是提高容错性)
  • 每个broker上都会有一些分区的leader,一些分区的follwer。(目的是为了负责均衡)
  • 只有leader分区响应生产者消费者
  • 如果一个分区的leader挂掉后,会选择一个处于同步状态的副本作为新的leader

启动步骤

  • 在zk上注册一个自己的节点,同时监听Zookeeper的/brokers/ids路径下broker的变化情况。删除时会在Zookeeper的/brokers/ids中删除节点,但是自己的broker id节点不会删除
  • 在zk上/controller尝试创建临时节点,如果成功成为控制器,否则监听控制器节点的变化

分区偏移量

  • 消息消费后向特定的topic发送消息,将offset保存在zk中。如果发生分区在均衡,这样可以用kafka上获取到offset,使得消费者无状态
  • 可以通过seek方法指定偏移量和分区

消息可靠性

  • 同一个生产者生产的消息在broker中顺序一致
  • 消费者消费消息的顺序和日志中记录的顺序一致
  • 一个分区能有n个副本,能最大限度容忍n-1个副本挂掉

消息系统

队列和广播

  • 常见的消息系统有消息队列、消息广播监听
  • 消息队列:能在多个消费者之间进行消息分发,但是一旦消费消息将不见了
  • 消息广播监听:能将消息分发给多个消费者,但是所有监听的消费者都将收到消息
  • kafka使用消费者分组解决这个问题:相同分组内可以分发消息,不同分组间广播

消息保序

  • 传统队列,如果多个消费者进行消费。发出消息的时候是保序的,但是并不能保证到达消费者处是保序的。所以很多时候只能有一个消费者消费队列,无法进行水平扩展
  • kafka使用一个主题加多个分区的方式,分区内部保序,一个消费者分组的一个消费者对应一个分区,保证消息保序。不同的消费者处理不同的分区

存储系统

  • 生产者生产消息,传给broker,需要等待broker确认存储成功
  • kafka使用日志片段的方式存储,使得伸缩性很好,无论数据量大小
  • 消费者可以自己控制offset选择读取内容

流处理

  • 从一个主题读取,进行流出,输出到一个主题
  • 使用kafka的流可以解决:消息保序、消息重复处理

整合

  • kafka可以用来处理历史数据(监听之前产生的数据),也可以处理新数据,使用的是相同的接口

应用场景

  • 系统和应用间进行消息传递
  • 对流进行处理,类似于storm

api

  • Producer API:用来生产消息
  • Consumer API:用来监听主题获取消息
  • Streams API:将一个Input流转换成另一个Output流
  • Connector API:与现有的关系型数据库链接

猜你喜欢

转载自blog.csdn.net/designer01/article/details/81837303