具象化模型
下图以订单、运输、告诉等信息,形容与kafka交互的过程,业务中的事件(如下单,领取,配送,评估,售后)会产生各类信息,最终以topic归类会集到kafka中
分区
同一类的音讯都会会集到一个Topic中,一个Topic能够分为多个Partition,Partition是最小的贮存单元,每一个Partition贮存着一部分的音讯,每个Partition都是一个独自的log文件,每条记录都以追加的模式写入
偏移量 & 音讯程序
Partition中每条记录都会被调配惟一的序号,称为Offset,即偏移量
Offset是一个递增的,不可变的数字,由kafka主动保护
当一条记录写入Partition的时候,它就被追加到log文件的开端,并被调配一个序号,作为 Offset
- 所以从Partition来看,单个Partition外部是有序的,但从Topic来看,音讯在Partition之间是无序的;如果心愿音讯保障齐全的程序,就只能存在一个Partition,又或者发送端指定发送到某个Partition,生产端指定从某个Partition生产
Partition 扩大 & 冗余
kafka集群由多个Broker形成,每个Broker中含有集群的局部数据,同一个Topic的多个 Partition将散布在多个Broker中;Partition会生成多个正本,它们会扩散在不同的Broker中,
如果某个Broker故障了,Consumer能够在其余Broker上找到Partition的正本,持续获取音讯
Message 写入
指定Partition
Producer发送音讯时,可指定一个Partition Key 这样就能够写入特定的Partition Partition Key会依据一个Hash函数计算出写入哪个Partition Partition Key雷同的音讯,会被放到雷同的Partition 这种形式须要留神数据歪斜问题
随机Partition
如果没有应用Partition Key,kafka则会应用轮询的形式来决定写入哪个Partition 音讯会平衡的写入各个Partition,这样无奈确保音讯的有序性
自定义规定
Kafka 反对自定义规定,一个 Producer 能够应用本人的分区指定规定。
Message 读取
kafka的音讯读取采纳的是pull形式,Consumer须要被动从Topic的Partition拉取音讯,Pull模式下,Consumer就能够依据本人的生产能力去决定生产策略
但Pull有个毛病是,如果broker没有可供生产的音讯,将导致consumer一直在循环中轮询,直到新音讯达到
为了防止这点,kafka有个参数能够让Consumer阻塞直到新音讯达到,也能够阻塞直到音讯的数量累积到某个特定的值再读取
音讯的Offset就是Consumer的游标,依据Offset来记录音讯的生产状况
读完一条音讯之后,Consumer会推动到Partition中的下一个Offset持续读取音讯
Offset由Consumer负责保护
生产组
Consumer Group下有一个或多个Consumer,这些Consumer有雷同的groupId,groupId是一个字符串,生产组的惟一标识
Topic中的每个分区只能调配给某个Consumer Group的一个Consumer生产(该分区还能够被调配给其余生产组)
参考资料:
https://medium.com/event-driv...
本文中大部分的图来自上述博客,应该是一位印度工程师所写,原文为英文且查看须要翻墙
https://www.bilibili.com/read...