《kafka权威指南》总结篇
kafka 是 linkedin 公司开发的,为解决用户行为日志而产生;
kafka的最初目的并非消息队列组件,而流式处理平台;
只是其中有的功能看起来像一个消息队列组件;
1. 发布订阅功能;
2. 存储流式日志数据;
3. 实时处理流式数据;
kafka安装很简单,主要是要调整下一些配置参数。broker.id, port, zookeeper.connect, log.dirs, num.recovery.thread.per.data.dir, auto.create.topics.enable, num.partions, log.retention.ms, ...
Kafka部署环境:
1. 磁盘性能直接影响kafka吞吐量。
3. 内存同样影响其吞吐能力,jvm不需要太多内存,但是多余的系统内存可以被用作页面缓存(性能关键)。
4. 网络同样影响其吞吐量,在其他性能都很好时,如果带宽受限则吞吐量受限,且kafka还会存在数据集群复制和镜像也会占用网络流量。
5. kafka对cpu要求相对不高,但在压缩方面会影响cpu负载。
kafka容量估算,受限于复制系统和单个分区存储能力;适当对操作系统调优;
kafka处理模型为(推送和拉取):生产者发送数据到kafka,发送将会按照分区规则进行指定分区,kafka会暂时将数据存储在内存,然后在适当时机冲刷到磁盘,随后消费者进行主动拉取式消费,自行维护数据偏移,从而完成消息从生产者转移到消费者的传递。
kafka由很多broker组成,单个broker可以轻松处理数千个分区以及每秒百万级的消息量。
kafka一般都是集群部署的,每个集群都有一个broker充当了集群控制器的角色(集群选举产生)。控制器负责管理工作,包括将分区分配给broker和监控broker。一个分区从属于broker,即每个分区的首领。如果一个broker失效,其他broker可以接管领导权。
kafka具有保留消息的能力,这是它和很多消息中间件差异较大地方。可以设置保留天数,可以设置到达一定数量后。
消费者群组可以作为一个统一的消费者,共享一个消息流,整个群组对同一个消息只处理一次。而普通非群组机器,则是任意消费数据。
远程读取比远程生成更加安全。因为如果消费者连接到生产集群,最多也就是无法读取数据,但数据仍然会保存在kafka里很长时间。而相反居发生网络分区时,已经读取了数据却无法发送生成数据到目标机器,那么就会造成数据丢失。(MirrorMaker)
生产者主要负责数据发送,关键点:
1. 需要指定几个broker地址信息,当一个不可用时,可以切到下一个。
2. 指定序列化方式,key和value序列化方式,avro;
3. 有异步发送和同步等待,差别在于是否阻塞get();
4. 异步发送可以设置回调方法;
5. acks用于设置与kafka的确认方式,取决性能和可靠性的平衡。值有0, 1, all.
6. retries 配置重试次数;
7. buffer.memory
8. compression.type snapy, gzip, lz4
9. batch.size 一个批次可使用大小;
10. 可以自定义分区器,用于指定发送的分区,实现 Partioner 接口即可。
kafka消费者,一般为群组消费,要点:
1. 群组会自动实现负载均衡;
2. 分区再均衡时,消费者将暂停消息,并收到通知,可以自行处理数据;
3. 消费者上线或下线时会触发再均衡;
4. consumer.subscribe("test.*") 消息数据;
5. 通过 consumer.poll(100)拉取数据;
6. 可以自动提交偏移,也可以主动提交偏移;
7. fetch.min.bytes 获取最小字节数;
8. fetch.max.wait.ms 最长等待时间;
9. session.timeout.ms 会话超时;
10. auto.offset.reset 无偏移时的消费偏移策略,earliest, latest .
11. enable.auto.commit 自动提交;
12. partition.assignment.strategy 分区分配策略;
13. max.poll.records 单次最大数;
14. __consumer_offset 特殊主题保存偏移量;
15. ...
16. 再均衡监听器,可以进行清理工作;实现 ConsumerRebalanceListener. 可以监听 丢失分区前事件(清理现场),也可以监听新分区被分配时事件(初始化数据);
17.
深入kafka
1. kafka如何复制;
2. kafka如何处理来自生产者和消费者的请求;
3. kafka存储细节;
控制器由/controller 节点控制;使用epoch来避免脑裂;
复制特性是kafka的重要特性和架构核心。
副本类型有 首领副本和跟随者副本。首选首领是第一个副本;
处理请求流程:broker会在各监听端口运行一个acceptor,创建连接后交给processor处理,processor数量可配置,它从客户端获取连接请求,把它放到请求队列,然后从响应队列里获取消息,发送给客户端;具体业务处理由io线程处理(从请求队列获取数据,完后放入响应队列)
消费者可以设定,让broker等到有足够多数据后再返回(实现原理应该是sleep()或者wait/notify模式),也可以设置最大超时时间;
可以自定义实现与broker通信协议,但broker之间也有同样的通信协议,客户端不应该使用这些请求。比如新首领选举出来,控制器会发送LeaderAndIsr请求给新首领和跟随者。
kafka基本存储单元是分区,无法再细分;
kafka分区分配策略会保证,分区均衡地分布在broker集群里,包括机架信息。
文件会按修改日期和设置的过期策略进行删除,活跃片段不会删除。
kafka的索引是为了让broker快速定位到偏移处,索引把偏移量映射到片段和偏移量所在文件的位置;索引也被分为片段,所以在删除消息时,也可以删除相应索引;(索引是非必须的,如果不存在将被kafka重建)
清理使用map保存散列值和偏移量,将污浊部分清理掉。
事件删除场景,比如将用户从系统删除,应用程序发送null消息,墓碑消息,该消息会被清理线程从kafka里删除。
kafka可靠的数据传递
kafka可靠性保证:
1. 保证分区有序;
2. 只有当消息写入所有副本时,才认为消息已提交,消费者才可用;
3. 只要有一个副本是活跃的,那么消息就不会丢失;
4. 消费者只能读取到已提交的消息;
复制系统默认为3,可以自定义,但尽量为奇数;
不完全首领选举,可以开启但是有风险;
应用程序验证,依次重启broker,依次重启消费者,依次重启生产者,客户端从服务器断开,首领选举。
构建数据管道connect
数据库A到数据库C的迁移;mysql到es;
跨集群数据镜像 mirrormaker
使用场景
1. 区域集群和中心集群;
2. 冗余dr;
3. 云迁移;
流处理:
kafka是个稳定的数据来源;
流处理的设计模式:
时间窗口,流join,
流处理的设计模式:单个事件处理,本地状态;map或filter模式;
单机10w/30s,tps: 3300+;
实际上只成功7w/30s,即tps: 2000+, 即被内存锁住(512M);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?