1.Kafka定义
Kafka是分布式的发布订阅消息系统,可划分的,冗余备份的持久性日志服务
2.Kafka的作用
- 缓冲削峰
- 解耦可扩展
- 异步
- 冗余(一对多的发送消息)
- 健壮性(堆积请求,消费者可以短时间挂掉)
3.Kafka中ISR,AR表示什么?ISR伸缩是什么?
-
AR=ISR+OSR
-
ISR:副本同步队列
-
AR:所有副本
ISR由leader维护,如果其中一个副本的同步时间延迟与数据延迟达到一个阈值就会被踢出ISR,进入OSR,如果开启Unclean这个参数,副本leade挂掉就会从AR中选取新的leader,但这样就会有副本数据同步不一致的问题
4.kafka的数据同步(确认机制)
- 0代表生产者发送了即commit
- 1代表需要Leader确认收到
- -1代表需要Leader及所有的副本都收到
5.kafka为什么快
- 磁盘顺序写比内存随机读快
- 0 Copy技术
- 批量处理,合并小请求
- pull模式,考虑消费者端的处理能力
- PageCache缓存
6.优化打入速度
- 增加线程
- 增加producer实例
- 增加分区
- 增大副本同步线程
7.kafka的Message格式
固定的Header:magic (attribute:当magic=1) crc
不定长的Body:键值对
8.Kafka为什么不支持读写分离
- 数据不一致
- 数据同步带来的消耗
9.的偏移量是Offset+1
10.Kafka数据积压(限流)
- 提高SparkStreaming的消费条数(maxperPartion)
- 提高Kafka发送指定消费的条数
- SparkStreaming的反压机制(动态设置参数,令牌桶算法)
11.Kafka数据丢失
设置消息确认为-1,手动维护偏移量
12.Kafka数据重复
使用Redis进行数据去重
13.Kafka实现顺序消费(只能保证单分区)
-
单topic,单分区(这种方式不使用,降低的高吞吐)
-
重试机制会导致顺序的错乱,所以开启幂等性机制,比较Producer维护的序号和Broker维护的序号
14.Kafka的Leader选举
- Broker的Leader(谁先连接上zookeeper)
- 副本Leader(从AR中顺序选择一个在ISR中的副本)
- 消息组的Leader(从维护的HashMap中取一个)
15.Kafka实现延迟队列
基于时间轮
image.png若时间轮的tickMs=1ms,wheelSize=20,那么可以计算得出interval为20ms。初始情况下表盘指针currentTime指向时间格0,此时有一个定时为2ms的任务插入进来会存放到时间格为2的TimerTaskList中。随着时间的不断推移,指针currentTime不断向前推进,过了2ms之后,当到达时间格2时,就需要将时间格2所对应的TimeTaskList中的任务做相应的到期操作。此时若又有一个定时为8ms的任务插入进来,则会存放到时间格10中,currentTime再过8ms后会指向时间格10。如果同时有一个定时为19ms的任务插入进来怎么办?新来的TimerTaskEntry会复用原来的TimerTaskList,所以它会插入到原本已经到期的时间格1中。总之,整个时间轮的总体跨度是不变的,随着指针currentTime的不断推进,当前时间轮所能处理的时间段也在不断后移,总体时间范围在currentTime和currentTime+interval之间。
如果此时有个定时为350ms的任务该如何处理?直接扩充wheelSize的大小么?Kafka中不乏几万甚至几十万毫秒的定时任务,这个wheelSize的扩充没有底线,就算将所有的定时任务的到期时间都设定一个上限,比如100万毫秒,那么这个wheelSize为100万毫秒的时间轮不仅占用很大的内存空间,而且效率也会拉低。Kafka为此引入了层级时间轮的概念,当任务的到期时间超过了当前时间轮所表示的时间范围时,就会尝试添加到上层时间轮中。类似于钟表
16.Kafka事务
- 保证幂等性
- 设置一个TranscationId,保证只有一个生产者在处理事务
- Producer5个事务方法:initTransactions()方法用来初始化事务;beginTransaction()方法用来开启事务;sendOffsetsToTransaction()方法为消费者提供在事务内的位移提交的操作;commitTransaction()方法用来提交事务;abortTransaction()方法用来中止事务,类似于事务回滚
- 消费者端可以设置事务可见级别isolation.level
- 消费者会缓存消息,直到生产者端提交事务,然后再发送送应用处理
17.O COPY技术
传统发送方式
image.pngKafka的发送方式
image.png
网友评论