知识星球
1、kafka消费者每次消费的时候会记录偏移量知道自己该消费那个消息了,当消息进行重试后,Kafka实例怎么处理消息的偏移量?
2、怎么说服用redis stream而不使用kafka?不用考虑成本问题
3、kafka 的batch.size 一般怎么设置?
4、kafka在tcp层面怎么做顺序的?
5、老师 kafka获取消费者连接状态超时是什么问题? kafka服务器的内存和cpu都占用不高
6、说kafka批量获取的过程
7、kafka顺序消费问题,同一业务Id的消息到了同一jvm内多线程消费如何保证有序?用 spring-kafka 的话,会发现无论哪种方式,都并不太好处理怎么办?
8、建立一个服务接收 http 请求、根据传入的参数(topic)从 Kafka 指定 topic 拉取一定数量的消息后返回。但 Kafka 的消费者是要保持轮询的,不然就只能每次建立消费者、获取分区/加入群组、请求数据后关闭消费者(但这样效率很低)。
请问有什么比较好又可靠的实现方法吗?
面试问题(mm上)
1、为什么读写log用filechannel,读写index用mmap
append日志基于用户空间到pagecache的FileChannel.write
索引文件index中的mmap是基于固定大小的随机读写文件的映射(消费传输时也是这个机制)。
综合考虑:mmap大块文件读写时有优势,不适合大小不一的小文本读,例如小于4kb的这种。写日志时不好控制,因为消费者可以控制消息和批量数量。读index时,kafka做了优化,保证大部分情况下,映射到pagecache中索引段满足需求
2、partition 10个,consumer设置多少合适
这是一个容量评估的问题,消息积压consumer group中的机器数量是否超过partition,如果超过partition,扩容partition。如果机器比较少先扩容机器。抗过这一波优化代码,加快单个partition的消费速度
3、如何实现exactly once?
4、消息积压怎么解决,消息失效怎么解决?
5、kafka怎么保证单partition有序的?
6、Kafka选举实现
7、offset 极限是多少 过了极限然后是多少
8、事务如何实现的
9、数据经常丢失怎么排查?
10、副本状态机怎么实现的,leader epoch是怎么保证正确的
11、不用zk,怎么管理集群元数据信息
12、kafka producer 发送消息到broker然后持久化的过程中,怎么保证顺序的,因为网络可能发生抖动
13、定时调度器怎么调度它和主调度器有啥区别
14、consumer group是怎么实现的?
15、分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
16、如果kafka用来做服务分发的话,一个服务就要开一个partion,开上几十个磁盘的io压力会不会扛不住?怎么解决?
17、副本所在的物理机器如果磁盘满了,该怎么处理后续消息写问题,极限情况所有副本所在机器的物理磁盘满了,又该如何解决
18、page cache怎么关闭?
19、写入报错,为什么fetcher拉取会停止呢,这个fetcher是消费消息么
20、为什么kafka用在线上实时消息的少,用于离线任务多?
21、新版kafka为什么放弃了zk?
22、kafka的内存池如何保证高性能的
23、如果kafka用来做服务分发的话,一个服务就要开一个partion,开上几十个磁盘的io压力会不会扛不住?怎么解决?
24、kafka如果所有broker同时挂掉该如何保证可用性
25、为什么consumer要设计成线程不安全
26、事务的实现,consumer怎么保证只消费一次
27、如何从server.log里判断正在rebalance
28、多个集群挂了一个节点,然后程序就取不到数据了,但是用命令行能取到数据,还有程序随便换个group也能取到数据,这是咋回事啊
29、kafka消费者过去一年处理数据出了bug,现在需要修复历史数据,上游也无法再造数据?我们应该怎么处理哈:1.如何追回历史数据;2.能追回多少,3对于追回的如何做幂等4.对于无法挽回的数据,有什么好的idea给业务方
30、讲讲kafka的性能瓶颈,为什么topic过多时性能会骤降
31、怎么解决重复消费,除了幂等?
ack设置为负1,但是很慢
32、Kafka Eagle,开源的监控工具
33、ack机制、分区策略,压力测试,决定用几台机器的公式
数据方向
1、基本信息
1)组成
2)安装多少台: 2(生产者峰值的生产速率 * 副本 /100)+ 1 = 3台
3)压测:生产者峰值的生产速率、消费者消费的峰值消费速率
4)副本:2-3 2个居多 默认一个副本
副本越多: 可靠性越高、 通信效率降低了
5)Kafka的数据量
100万日活、 1人每天100条、1条日志0.5k-2k 1k
平均速率:100万*100条 /(24*3600s)=1150条/s 1m/s
一天当中哪个时间段,数据最多。7-12 点 =》手纸 20m/s <50m/s
6)默认保存数据多久
7天 =》 3天 OPPO 6个小时(实时数仓)
7)磁盘空间预留多少
100g * 副本2 * 3天 / 0.7=
8)是否做监控?
kafkamanager kafkaeagle 开源的?
我们公司自己开发的。仰视大佬。
9)分区 3-10个分区
设置1个分区
压测:生产者峰值的生产速率tp、消费者消费的峰值消费速率tc
自己有一个期望的吞吐量t
分区数=t/min(tp, tc)
t =100m/s tp=20m/s tc =50m/s
分区数=100m/s / 20m/s = 5个分区
10)分区分配策略
Range 默认
10分区 3个消费线程
0 1 2 3 容易导致数据倾斜
4 5 6
7 8 9
RoundRobin: 全部采用hash的方式随机打散,再采用轮询的方式
可以减少数据倾斜。
11)ISR
主要解决:leader挂了谁当老大问题。在isr队列的都有机会当老大
旧版本:延迟时间、延迟条数 新版本:延迟时间
12)多少个topic
flume/canal =》 kafka(满足下一级所有消费者)
一张表一个topic
2、挂了
flume有channel channel可以缓冲数据
日志服务器有30天的数据
3、丢了
ack :
0 :发送过来数据就不管了, 效率高、 可靠性最差
1 :发送过来的数据leader应答, 效率中等、可靠性中等
-1 :发送过来的数据leader和follower共同应答。 效率最低、可靠性最高
在生产环境怎么选?
如果是金融公司或者对钱准确度要求比较高,选-1
如果是普通的日志,丢几条数据无所谓,选择1
4、重复了
事务、幂等性 + ack=-1 => 影响效率
下一级处理 hive的dwd层、sparkstreaming redis
如果是金融公司或者对钱准确度要求比较高,事务、幂等性
如果是普通的日志, 下一级处理
5、积压了
1)增加分区,同时要求消费者增加对应的CPU核数
1 个分区=》 5个分区
CPU1个=》 5个 sparkstreaming 提交参数:指定CPU的核数
2)加快消费者消费速度:
flume/sparkstreaming batchsize 1000条/s =》 2000条/s
6、优化
1) 7天=》 3天
2)副本调整为2个=》可靠性
3) 增加通信延迟
4)采用压缩
5)调整内存 默认1g => 4-6g => 可以考虑增加服务器台数
7、杂七杂八
1)Kafka高效读写数据
集群、分区、顺序读写600m/s 随机读写100m
零拷贝
2)传输一条2m的日志会有什么问题?