Kafka
开发
快速上手
-
构建生产者
Properties prop = new Properties(); new KafkaProducer<String, String>(prop);
-
配置相关类,ProducerConfig
生产者
常见配置
#限制发送的消息最大值
max.request.size
#重试次数
retries
#重试时间间隔
rtry.backoff.ms
#是否保证消息有序
max.in.flight.requests.per.connection
#指定消息的压缩方式
compression.type
#连接保持时间
connections.max.idle.ms
#单批次处理消息的等待时间
linger.ms
#设置接收消息的缓冲区大小
receive.buffer.bytes
#设置发送消息的缓冲区大小
sender.buffer.bytes
#请求等待响应的最长时间
request.timeout.ms
序列化器
- 默认序列化器
- 自定义序列化器,需要在配置中加入该配置
分区器
- 用于指定消息的处理分区
- 接口类,Partitioner
- 默认分区处理器
- 自定义分区处理器,需要在配置中加入该配置
生产者拦截器
- 接口类,ProducerInterceptor
- 自定义拦截器,需要在配置中加入该配置
消息发送
- 同步发送
- 异步发送
消息处理流程
- 创建消息
- 发送消息
- 拦截器
- 序列化器
- 分区器
- 消息累加器
- 消息批处理
- 到达分区
消费者
常见配置
#设置消费者与订阅者主题之间的分区分配策略
partition.assignment.strategy
#指定连接的kafka集群地址
bootstrap.servers
#消费者隶属的消费组的名称
group.id
#键和值的反序列化
key.deserializer和valuedeserializer
#一次拉取请求中拉取的最小值
fetch.min.bytes
#一次拉取请求中拉取的最大值
fetch.max.bytes
#等待时间,默认500(ms)
fetch.max.ait.ms
#返回的最大数据量
max.partition.fetch.bytes
#一次拉取的最大消息数
max.poll.records
#连接保持时间
connections.max.idle.ms
#是否可以向消费者公开内部主题
exclude.internal.topics
#接收消息的缓冲区大小
receive.buffer.bytes
#请求等待响应的最大时间
request.timeout.ms
#元数据过期时间
metadata.max.age.ms
#重新连接之前的等待时间
reconnect.backoff.ms
#重试之前的等待时间
retry.backoff.ms
#事务隔离级别
isolation.level
订阅主题
反序列化器
消费者拦截器
消费者消费
- 推模式
- 拉模式
消费位移提交
再均衡
- 指分区的所属权从一个消费者转移到另一消费者的行为
消息消费流程
- 配置消费者客户端参数及创建的消费者实例
- 订阅主题
- 拉取消息并消费
- 提交消费位移
- 关闭消费者实例
消息过期方式
- TTL(Time To Live,过期时间)
- 自定义TTL消息,指定ttl过期时间
- 自定义消费组TTL的拦截器,到目前为止,无论是固定消息TTL,还是自定义消息TTL,都是在消费者客户端通过拦截器来实现的
队列种类
延时队列
延时消息是指消息被返送以后,并不想让消费组立即获取,而是等待特定的时间后,消费者才能获取这个消息进行消费
- 实现方式
- 可以通过消费组客户端拦截器来实现延时队列
- 也可以使用双重主题实现,即先投递到预备主题中,当延时到达时投递到目标主题中进行消费
死信队列
重试队列
回退队列
消息路由
- 默认按照主题进行路由,消息发往主题之后,会被订阅的消费者全盘接收
- 可以通过细粒度化切分主题来实现消息精确路由
消息轨迹
消息审计
- 指消息生产、存储和消费的整个过程之间对消息个数及延迟的审计
- 以此来检测是否有数据丢失、数据重复、端到端的延迟时长
消息代理
- 通过Kafka集群提供的REST API接口,实现发送消息、消费消息、查看集群的状态和执行管理类操作
主题管理
主题
- 创建主题
- 查看主题
- 修改主题
- 删除主题
- 配置管理
- 主题相关参数
- 主题合法性验证
分区
- 分区与副本配置
- 优先副本的选举
- 分区重分配
- 复制限流
- 修改副本因子
- 性能测试工具
- 分区数越多吞吐量就越高嘛
- 分区数的上限
- 分区考量因素
日志存储
消息文件
-
消息存储格式
-
消息压缩
索引文件
- 偏移量索引
- 时间戳索引
日志清理与清理策略
- 日志删除(Log Retention)
- 按照一定的保留策略直接删除不符合条件的日志分段
- 方式
- 基于时间删除
- 基于日志大小删除
- 基于日志起始偏移量删除
- 日志压缩(Log Compaction)
- 针对每个消息的Key进行整合,对于有相同key的不同value,只保留最后一个版本
磁盘存储
- 页缓存
- 磁盘I/O流程
- 磁盘调度算法
- 零拷贝技术
日志同步机制
服务端
交互协议
- 支持43种协议类型,都遵守特定的协议模式,每种协议类型都有对应的请求和响应
- 消息发送
- 消息拉取
时间轮
- 基于时间轮的概念自定义了一个用于延时功能的定时器(System Timer)
- 时间轮是一个存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表(TimerTaskList)
- TimerTaskList是一个环形的双向链表
- 链表中的每一项表示的都是定时任务项,其中封装了真正的定时任务(TimerTask)
控制器
- 简述
- 集群中的一个或多个Broker会被选举为控制器(Kafka Controller)
- 负责管理整个集群中的所有分区和副本状态
- 当某个分区的Leader副本出现故障时,由控制器负责为该分区选举新的Leader副本
- 当检测到某个分区的IR集合发生变化时,由控制器负责同志所有Broker更新其元数据信息
- 当增加分区数量时,由控制器负责分区的重新分配
- 控制器的选举与异常恢复
- 控制器的职责
- 监听分区相关变化
- 监听主题相关的变化
- 监听Broker相关的变化
- 启动并管理分区状态机和副本状态机
- 更新集群的元数据信息
- 负责维护分区的优先副本的均衡
- 分区Leader的选举
优雅关闭Kafka
- 使用官方提供的脚本工具,kafka-server-stop.sh
配置
- meta.properties文件
- 服务端参数列表
副本(Replica)
- 简述
- 分布式系统中常见的概念之一,指分布式系统对数据和服务提供的一种冗余方式
- 失效副本,以及失效产生的原因
- 副本进程卡住,在一段时间内没有向Leader副本发起同步请求
- 副本进程同步慢,在一段时间内无法追赶上Leader副本
- 分类
- 本地副本(Local Replica)
- 远程副本(Remote Replica)
LEO和HW
客户端
分区分配策略
- RangeAssignor
- RoundRobinAssignor
- StickyAssignor
- 自定义分区分配策略,PartitionAssignor
- Subscription,表示消费者的订阅信息
- Assignment,表示分配结果信息
消费者协调器和组协调器
再均衡的原理
位移提交(__consumer_offsets)分析
事务
- 消息传输保障三个级别
- at most once(至多一次)。消息可能会丢失,但绝对不会重复传输
- at least once(最少一次)。消息绝对不会丢失,但可能会重复传输
- exactly once(恰好一次)。每条消息肯定会被传输一次且仅传输一次
- 消费者消息的幂等性
- 多次调用所产生的结果和调用一次是一致的
- enable.idempotence设置为True即可
- 生产者消息的幂等性
Kafka应用
命令行工具
- 消费组管理
- 消费位移管理
- 手动删除消息
Kafka Connect
是为在Kafka和外部数据存储系统之间移动数据提供了一种可靠的且可伸缩的实现方式
- 特性
- 通用性,规范化其它数据系统与kafka的集成,简化了连接器的开发、部署和管理
- 支持独立模式和分布式模式
- Rest接口
- 自动位移管理
- 分布式和可拓展性
- 流式计算/批处理集成
Kafka Mirror Maker
- 用于两个集群之间同步数据的一个工具,通过源集群中消费消息,然后将消息生产到目标集群中,也就是木桶的生产和消费消息
- 可以在两个不同的数据中心中同步(镜像)数据
Kafka Streams
简述
- 用于处理和分析数据的客户端
- 将存储在Kafka中的数据进行处理和分析,然后将最终所得的数据结果回写到kafka或发送到外部系统
- 建立在流式处理概念之上,例如分区时间时间和处理时间、窗口支持,以及应用程序状态的简单(高效)管理
解决的问题
- 毫秒级延迟的逐个事件处理
- 有状态的处理,包括连接(Join)和聚合类操作
- 提供了必要的流程处理原语,包括高级流处理DSL和低级处理器API
- 使用类似DataFlow的模型对无需数据进行窗口化处理
- 具有快速故障切换的分布式处理和容错能力
- 无停机滚动部署
Kafka监控
监控产品
- kafka Manager
- Kafka Eagle
- Kafka Monitor
- KafkaOffsetMonitor
- Kafka Web Console
- Burrow
监控维度
- 集群信息
- broker信息
- 主题信息
- 消费组信息
监控数据的来源
- 通过开启JMX(Java Managent Extension,JAVA管理拓展)来获取
- 确保Kafka开启了JMX的功能(默认关闭)
消费滞后
- 消息中间件中保留的消息与消费的消息之间的差值即为消息堆积量,也称为消费滞后(Lag)
同步失效分区
- 处于同步失效或者功能失效(比如处于非活跃状态)的副本统称为失效副本
- 而包含失效副本的分区就成为同步失效分区
监控指标
- Kafka提供的JMX监控指标已经超过500个
监控系统架构
- 数据采集
- 数据存储
- 数据展示