Kafka的概念以及Producer相关知识回顾总结
一、概念
1.消息队列的应用场景
1.缓存消峰(一次性解决不完,先放到消息队列当中)
2.解耦(解决多个渠道的数据来源问题)
3.异步 (解决完一个问题,提前返回结果,不用解决完之后一起返回)
2.消息队列的两种模式
1.点对点模式(消费者主动拉取数据,消息收到后清除消息)
2.发布/订阅模式(1.消息队列可以设置多个Topic主题,比如:浏览,点赞,收藏等。2.消费者接受数据后不删除数据。3.消费者相互独立,都可以消费到数据)
二、生产者
1.原理流程图
2.生产者发送数据的两种方式
1.同步发送(在异步的基础上加上get)
2.异步发送(常用)
3.回调异步发送(返回主题,分区等信息)
3.生产者如何提高吞吐量?
1.batch.size 批次大小,默认16k
2.linger.ms 等待时间,默认是0。(可以修改为5~100ms)
3.compression.type 压缩(snappy,gzip)
4.RecordAccumulator 缓冲区大小,默认是32m。(可以修改为64m)
4.生产者分区
1.默认随机(粘性,不重复分区)
2.根据key的hash值对分区数取%
3.可以设置分区
4.复杂场景可以自定义分区(实现partitioner接口)
5.Kafka如何保证数据可靠性
1.ack=0 (一般不用)不管leader是否接收到数据,生产者依然继续发送(效率高,但是容易丢失数据)
2.ack=1 (传输普通日志)leader接收到数据应答后,生产者才能继续发送数据(不能确保follower能否接收到数据,可靠性跟安全性一般)
3.ack=-1 (重要数据,金钱相关)leader接收到数据应答,并且ISR((leader+follower的状态)follower跟leader之间默认每30s进行一次通信,判断follower是否挂掉)
至少一次(数据安全,但是可能有重复):ack=-1+分区副本大于等于2+ISR应答的最小副本大于等于2
最多一次(数据不安全,但数据不重复):ack=0
6.在ack=-1的情况下,leader跟follower接收到数据后,在应答的时候,leader挂掉,重新选取别的leader,新的leader要重新接收这份数据,可能会造成数据重复,如何解决?
幂等性(确保单分区,单会话内不重复)+事务(解决幂等性出现的Kafka挂掉重启导致PID不一致的问题)
幂等性<PID,Partition,SeqNumber>唯一:PID每次Kafka重新启动分配的新的,Partition分区数,SeqNumber生产者产生的序列号(单调递增)
1.精准一次=幂等性+至少一次(ack=-1+分区副本大于等于2+ISR应答的最小副本大于等于2)
2.开启事务,必须自定义一个唯一的事务id,即使Kafka挂掉也能继续处理未完成的事物
7.乱序
开启幂等性设置参数小于等于5,因为默认每个broker最多可以缓存5个请求。根据幂等性的SeqNumber单调递增,如果有序的则可以落盘,如果没序则要进入缓存排序,之后再落盘
尚硅谷讲的真的很棒,相关资料资源链接
链接:https://pan.baidu.com/s/15nsdIwLJ3vd_h9VAug3kbQ
提取码:wcdx