Kafka(一) 概述

概览

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

kafka解决的问题

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

主题

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

分区

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

消息

  • 包含:主题、分区、消息建、消息(入下图)

批次

  • 一组消息,一组消息属于同一主题的同一分区,数据会被压缩

生产者

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

消费者

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

再均衡监听器

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

消费者群组

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

生产者分区和消费者群组

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

broker

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

broker集群

  • 第一步选举出一个broker作为控制器,控制器的主要作用是:
    • 将分区分配给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选择读取内容

发布了0 篇原创文章 · 获赞 37 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/superviser3000/article/details/85328488