Event streaming is the digital equivalent of the human body’s central nervous system
概述
分布式基于发布/订阅模式的消息队列,应用于大数据实时处理领域。
1 6 3005
优点
- 解耦 消费者生产者不再是直接的关系 有中间介质
- 异步 生产者不需要等待消费者消费
- 削峰 因为生产者消费者处理事件不再是即时性的所以可以错峰处理
两种模式
- 点对点 消费者主动拉取消息 问题:消费者无法得知消息队列是否有消息需要消费
- 发布订阅 一对多 消息队列推信息给消费者 问题:消息队列无法感知消费者消费速度
结构
- broker 主题 消息队列分区 ,一台 kafka 服务器就是一个 或多个broker。一个集群由多个 broker 组成。一个 broker,可以容纳多个 topic。
- Topic 逻辑:可以理解为一个队列消息的分类,生产者和消费者面向的都是一个 topic;
- Partition物理分区:为了实现扩展性实现负载,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列
- follower 副本 leader主要 生产者消费者只找leader
- consumer group 消费者组 某一个分区只能被同一个消费者组里的消费者消费
- zookeeper 如果kafka要集群要用一套zk保存集群的元信息
生产者和消息队列工作流程
- follow主动向leader拉数据
负载均衡
- producer 可以轮训自定义发送到哪一个partition
- producer发送到同一个partition,消费者从同一个地方消费
分片和索引机制
生产者生产的信息不断增加在log文件末尾,为防止log文件过大导致数据定位效率低下。
segment
每个partition分为多个segment,每个segment对应两个文件.index索引和.log数据和 timeindex索引文件
message结构
1、 offset:offset是一个占8byte的有序id号,它可以唯一确定每条消息在parition内的位置!
2、 消息大小:消息大小占用4byte,用于描述消息的大小。
3、 消息体:消息体存放的是实际的消息数据(被压缩过),占用的空间根据具体的消息而不一样。
文件夹命名规则
topic名称+分区序号
分区的原因
- 方便集群中扩展
- 可以提高并发 为p为单位读写
分区原则
将producer发送的数据封装成一个ProducerRecord对象
- 指明 partition 的情况下,直接将指明的值直接作为 partiton 值;
- 没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition
数进行取余得到 partition 值; - 既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后
面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition
值,也就是常说的 round-robin 算法
可靠性保证
每次p收到producer发送的数据后,想producer发送ack,则进行下一轮发送否则重新发送
查找策略
利用segment+有序offset+稀疏索引+二分查找+顺序查找等多种手段来高效的查找数据!
删除策略
从broker删除变得棘手,因为他不知道消费者是否消费这个信息,所以他将给予时间的sla应用于保留策略,超过一定事件后会删除
- n天前删除
- 暴露最近的MGB
副本同步策略
使用第二种并优化方案。ISR
同步副本 ISR
Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集
合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果follower
长时间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值
replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。
ack 三种可靠性级别
0 producer 不等待broker的ack
1 最多发送一次 不会重复 会丢 只确保leader成功
-1 不丢失 有重复 向所有follower都完成与leader同步才发送下一条
数据一致性问题
log文件中的hw和leo
hw leader和follower最大同步位置
Leo:所有副本最后一个位置
exactoy once 不重复也不丢失
幂等性 producter在初始化时分配一个pid 发往同一partition的信息附带sequence number ,broker会对其做缓存
消费者
多个消费者组成一个消费者组 有一个id,同一个消费者组的消费者可以洗哦啊飞统一topic下的不同分区的数据,但不会多个同一个组的消费者消费同一分区的数据
消费方式
consumer采用pull方式从broker 拉取数据
分区分配策略
- roundRobin
- Range
问题
zap协议