这是我参与「第五届青训营」伴学笔记活动的第十三天,今天初步了解了了kafka消息结构,相关概念以及消息分配方式。
kafka的流程
创建集群,增加topic,设置分区数量。引入sdk实现上游生产者逻辑,发送到topic中,最后将代码拉取出来进行业务处理。
基本概念
topic:逻辑队列,包含不同业务场景。
cluster:物理集群,建有不同topic,处理不同业务场景。
producer:将业务消息发送到topic中。
consumer:收到业务消息并处理。
partition:分区,不同分区可以并发处理。
offset:消息在分区中的id,严格递增。
follower:同步leader,差距过大会被队列。当发生宕机可以再ISR中选出副本继续工作。
controller:计算分配副本。
zookeeper:存储元信息,分配分区信息。
批量发送:按批量batch发送消息减少IO次数。
数据压缩:支持snappy,zstd压缩算法。
broker消息结构
1.存在大量副本以日志形式写入到磁盘中,切分成不同的logsegment,每个logment包含日志文件,偏移量索引文件,时间戳索引。
2.采用顺序写入,用二分查找小于目标文件的offset的最大文件。
3.对于时间戳文件相当于在offset文件上加了二级索引,同样使用二分查找小于目标文件时间戳的最大时间戳文件。
4.零拷贝:从磁盘把数据读到内核空间然后发送给网卡直接发送到消费者进程。降低了内存拷贝次数。
消息的接收
1.手动分配:有业务决定消费哪一个分区,会有进程启停,造成中断,无法自动容灾
2.high level:通过协调者进行自动分配。若发生宕机当所属分区分配给其他机器,若增加机器,则将其余的机器的分区调过来。
- rebelence:找到负载最低的broker,并返回所属协调者,当消费者都收到不同协调者的请求时,进行选取各自协调者中对应消费者的leader。leader计算分配的策略,选完leader,在总共经过三次发送请求后,把分配方案发送到协调者。