决战圣地玛丽乔亚Day10--kafka学习
概念上
kafka和RocketMQ的结构很类似。除了Broker、Producer、Consumer、Topic。多了一个分区的概念 Partition。对于NameServer的概念,kafka用的是zookeeper来保存信息。包括Broker和Topic的元数据信息。
分区:topic
topic的拆分,一个topic可以拆成指定个数的partition。然后kafka根据策略把分区分布在不同的Broker上。Producer发送某个topic的消息时就可以选择该Topic的某一个分区进行消息发送.
kafka在创建Topic可以指定多个分区,在此基础上再利用选择策略来保证高吞吐量。
然后通过分区的主从副本模式来保证高可用。主副本负责数据读写,主从副本之间的数据会进行同步,主副本挂掉了会重新选举一个新的主。
生产者发消息:
1.首先向broker请求获取topic的元数据信息,所有的broker都有缓存消息。
2.消息序列化--->分区器选择一个分区发送消息。
对于同一个topic的同一个分区的消息,会在缓冲区经历批次等待过程,最后通过压缩处理对消息进行批量发送
连接错误,可以通过再次建立连接来解决,“无主(noleader)” 错误则可 以通过重新为分区选举首领来解决。 KafkaProduce可以被配置成自动重试,如果在多次重试后仍无能解决问题,应用程序会收到一个重试异常。另一类错误无出通过重试解决 ,比如 序列化消息失败、缓存区已满,对于这类错误, KafkaProduce不会进行任何重试,直接抛出异常。
消息持久化过程:
不同于RocketMQ的所有MessageQueue的消息记录在一起,kafka采用每个分区一个文件记录的方式。
每个分区都有一个分区目录,放着日志log文件和索引index文件。
日志文件是具体内容,索引文件是找到log文件中的具体位置。 日志文件的大小可以根据log.segment.bytes进行配置。
这些日志文件和索引文件会不断被清理,依赖于topic的保留时长(log.retention.ms)和保留字节大小(log.retention.bytes)决定
消费者消费消息:
一个分区只会给一个消费者进行消费,因为消费者每次读都会保存最后一个消息的offset到Topic,下次根据最新的偏移量进行消息读取。
如果不同的Consumer去读同一个分区,会导致偏移量被覆盖,重复进行消息的消费。
高性能和高可用:
高性能:
1.批量+压缩:批量发送+压缩算法
2.顺序读写:提高磁盘写入速度
3.零拷贝技术:
kafka默认使用sendfile技术来实现消息的读取和写入,sendfile相对于mmap不仅可以减少拷贝次数,还可以减少上下文切换的次数。
4.索引文件
高可靠
1.1.acks参互
2.不完全首领选举
3.最小同步副本
4.同步异步刷盘
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!