首页  

深入理解Kafka:核心设计与实践原理 读书笔记     所属分类 kafka 浏览量 156
深入理解Kafka:核心设计与实践原理  
https://book.douban.com/subject/30437872/

https://github.com/hiddenzzh/kafka_book_demo



1. 初识 Kafka 消息系统 分区顺序性保证和回溯消费 存储系统 持久化和多副本 流式处理平台 流式处理类库 leader 维护 ISR(in-sync Replica),每个Partition都会有一个ISR,由leader动态维护 如果一个follower落后太多,从ISR中移除 当ISR中所有Replica都向Leader发送ACK时,leader才commit, HW机制 ,commit 的消息才对消费者可见 Producer, Broker, Consumer 通过 ZooKeeper 管理元数据、控制器的选举等操作 主题(topic) 生产者发送消息到特定主题,消费者订阅主题并消费 分区(partition) 消息存储 一个可追加的日志文件 偏移量(offset) 消息在分区中的唯一标识,保证分区内的有序性 分区 多副本机制(replica),副本之间是一主多从关系,leader 负责写请求,follower同步消息
2. 生产者 发送消息三种模式 发后即忘(fire-and-forget) 同步(sync) 异步(async) fire-and-forget 直接调用 send() sync 调用 send 之后调用 get() 等待 async: 传入回调 callback 自定义分区器 props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, MyPartitioner.class.getName());
3. 消费者 消费者和消费者组 每个消费者都有一个对应的消费者组(逻辑概念),消息发布到topic 后,只会投递给订阅它的每个消费组中的一个消费者。 消费者组是Kafka实现单播和广播两种消息模型的手段 配置消费者客户端参数及创建相应的消费者实例 订阅主题 拉取消息并消费 提交消费位移 关闭消费者实例 offset 自动位移提交 enable.auto.commit=true 设置为 false 可以手动提交 commitSync commitAsync seek 方法可以从特定位置读取消息
4. 主题和分区 主题管理 kafka-topics.sh --zookeeper localhost:2181/kafka --create --topic topic001 --partitions 6 --replication-factor 2 分区管理 leader 副本对外提供读写服务,flollwer 副本只负责数据同步 选择合适分区数 kafka-producer-perf-test.sh kafka-consumer-perf-test.sh 分区数超过某个阈值之后,相应的吞吐量也会下降
5 消息存储 文件目录 日志格式演变 v1 比 v0 多了时间戳 compression.type 压缩方式或者不压缩 日志索引 偏移量索引文件用来建立消息偏移量(offset)到物理地址之间的映射关系,方便快速定位消息所在的物理文件位置; 时间戳索引文件则根据指定的时间戳(timestamp)来查找对应的偏移量信息。 日志清理 两种日志清理策略 日志除(log retention): 删除不符合条件的日志分段 日志压缩(log compaction): 针对每个消息的 key 进行整合,对于相同 key 的不同 value 值,只保留最后一个版本 磁盘存储 顺序写磁盘速度很快,甚至比 随机 写内存快 使用 顺序追加、页缓存、零拷贝等技术提升性能 零拷贝(zero-copy) 将数据直接从磁盘文件复制到网卡设备中,减少内核和用户模式之间的上下文切换 和 数据拷贝 依赖 linux sendfile() ,DMA(Direct Memroy Access)
6.服务端 协议设计 自定义一组基于 tcp 的二进制协议,遵守协议就可以发消息给 kafka。 每种协议类型由对应的请求和响应,Request 包含请求头和请求体。 基于时间轮实现用于延时功能的定时器(SystemTimer),插入和删除O(1)。 Kafka 中的时间轮(TimingWheel)是一个存储定时任务的环形队列, 底层采用数组实现,数组中的每个元素可以存放一个 定时任务列表(TimerTaskList), TimerTaskList是一个环形的双向链表,链表每一项都是定时任务项(TimerTaskEntry), 其中封装了定时任务(TimerTask)。 一个或者多个 broker,其中一个 broker 会被选举为控制器(kafka controller),负责管理整个集群中所有分区和副本的状态。
7 客户端 partition.assignment.strategy 消费者和订阅主题之间的分区分配策略: RangeAssignor RoundRobinAssignor StickyAssignor 分区尽可能均匀;尽可能和上次分配一致 消费者协调器和组协调器 GroupCoordinator 服务端用于管理消费组的组件 消费者客户端 ConsumerCoordinator 组件负责和 GroupCoordinator 交互 如果消费者发生变化触发再均衡操作 __consumer_offsets 位移保存到 内部主题 __consumer_offsets 中 使用 kafka-console-consumer.sh 查看 __consumer_offsets 中的内容 事务 消息传输保障 at most once(至多一次) at least once(最少一次) exactly once(恰好一次) 0.11.0.0 版本引入幂等和事务这两个特性,实现 EOS(exactly once semantics) 幂等 客户端参数 properties.put("enable.idempotence", true); 为了实现生产者幂等,引入 producer id 和序列号 sequence number broker 在内存中维护一个序列号, 只有消息序列号的值(SN_new)比 broker 中维护的 SN_old 大 1, broker 才会接受 (SN_new=SN_old+1)。 只能保证单个生产者会话 (session) 中单分区的幂等 事务可以保证多个分区写入操作的原子性 properties.put("transactional.id", "transactionId")
8 可靠性探究 当 ISR 集合中的一个 follower 副本滞后 leader 副本的时间超过 replica.lag.time.max.ms 则同步失败 日志同步机制 PacificA 算法 副本数:一般设置为 3 客户端 acks 设置 acks=-1 leader 副本在写入本地日志之后还要等待 ISR 中的 follower 副本全部同步完成才告知生产者成功提交 同步刷盘策略(一般应该由多副本保证) broker 参数 log.flush.interval.messages 和 log.flush.interval.ms 调整同步刷盘策略 影响性能 enable.auto.commit 自动位移提交 可能导致 重复消费和消息丢失的问题
9. Kafka 应用 命令行工具 kafka.consumer-groups.sh 查看或者变更消费组信息 kafka-consumer.groups.sh 重置消费者组内消费位移 kafka-delete-records.sh 删除指定位置前的消息 Kafka Connect 两个核心概念 Source 负责导入数据到 kafka Sink 负责从 kafka 导出数据 connect-standalone.sh 独立模式运行 kafka connect。 Kafka Mirror Maker 集群之间同步数据 Kafka Streams 高吞吐、高可用、低延时 流式处理
10. Kafka 监控 监控维度:集群信息、broker 信息、主题信息和消费组信息 监控数据来源 集群层面的指标可以用 JMX 消费滞后 Lag 同步失效分区 同步失效副本,包含它的分区就是同步失效分区。 监控架构主要分为数据采集、数据存储、数据展示三个部分
11. 高级应用 过期时间(TTL) TTL(Time To Live,过期时间) 在消费者客户端拦截器实现 延时队列 订单系统,下单之后30 分钟内进行支付,没有成功支付则关闭订单 死信队列和重试队列 由于某些原因消息无法被正确投递,一般放到一个特殊的队列称为死信队列。 后续通过消费这个死信队列中的内容来分析当时遇到的异常情况,改善和优化系统。 消息路由 默认用主题进行路由 可在消息headers中加入信息,消费端中使用拦截器挑选特定业务标识消息 消息轨迹 通过封装客户端,保证正常生产消费的同时添加相应的轨迹信息埋点逻辑 消息审计 消息生产、存储和消费的整个过程之间对消息数和延迟的审计,检测是否有消息丢失、是否数据重复、端到端延迟等 消息代理 Kafka Rest Proxy Rest 接口 实现发送消息、消费消息、查看集群状态、执行管理操作等功能 The Kafka REST Proxy provides a RESTful interface to a Kafka cluster. It makes it easy to produce and consume messages, view the state of the cluster, and perform administrative actions without using the native Kafka protocol or clients. https://github.com/confluentinc/kafka-rest https://github.com/confluentinc/kafka-rest/blob/master/kafka-rest/src/main/java/io/confluent/kafkarest/controllers/TopicManagerImpl.java 消息中间件选型 RabbitMQ/Kafka/RocketMQ 选型维度 功能维度 性能维度 功能维度 优先级队列 延时队列 重试队列 死信队列 消费模式: push/pull 广播消费: 点对点(p2p),还是发布订阅(Pub/Sub) 回溯消费 消息堆积+持久化 消息轨迹 消息审计 消息过滤 多租户 多协议支持 跨语言支持 流量控制:调整发送速度。通常的流控方法有 stop-and-wait,滑动窗口、令牌桶等 消息顺序性 安全机制 消息幂等性。消息语义:至多一次;至少一次;精确一次 事务性消息:要么发送成功,要么失败 性能维度 可靠性和可用性。金融支付领域 RabbitMQ 多,日志处理、大数据 kafka 多。 运维管理。申请、审核、监控、告警、管理、容灾、部署等 社区和生态
12. Kafka 和 Spark 集成

上一篇     下一篇
linux OOM Killer 如何破

Kafka幂等和事务

kafka面试题及答案

管理学精髓:4大管理定律、4大管理法则、5大管理效应

80后经典老歌

关于人性的经典表述