1.什么是同步与异步
在Kafka的生产者当中有两个线程,一个main(主)线程还有一个Sender(发送)线程,在Kafka生产者发送消息的时候,main线程将数据发送到缓冲区,然后再由Sender线程来发送数据。
当main线程不需要等待Sender线程来发送数据,只需要自己发送数据到缓冲区就是异步发送。当main线程需要等待后续的应答,收到应答才能发送后续的消息就叫同步发送。
2.如何确定消息的准确性与不丢失
这个通过Kafka的返回确认结果来确定消息的发送(通常成为ack应答机制)
1.当ack= 0的时候数据发送器线程将数据发送到网络传输的时候就会给生产者现场发送ack响应表示可以发送下一条数据。这样的数据发送就是发送到网络上面很容易造成数据的丢失,但是这样就是速度快。
2.当ack= 1的时候在数据发送到Broker当中的Leader分区并保存到Leader分区的磁盘文件当中去,回返回ack=1这个时候数据已经同步到Leader当中去。数据相对于安全但是这个是不存在flower所以数据的可靠性不是很大还是可能会丢失。
3.当ack=-1(all)就是默认值。当数据保存到Leader与Fllower的分区的时候会返回ack,此时表示副本与Leader都保存好数据了。数据的安全性最高。
3.在ack应答机制下可能会造成数据重复
1.数据重复
当ack=1的时表示副本Leader已经保存数据,但是有可能网络或者机器故障导致ack没有传到生产者,当返回ack超时的时候生产者会认为数据发送失败会将数据退回缓冲区(kafka的重试retry),然后消息发送线程会将数据进行重新发送。当保存到分区的时候发现数据重复。
2.数据乱序
当我们需要将数据1,2 ,3发送到Kafka每一个数据对应一个请求,当3请求超时1,2请求正常就行奶妈retry可能会重新发送数据3,导致数据变成为2,1,3,数据的顺序被打乱。
4.解决数据的重复与乱序
Kafka采用数据的幂等性来保证数据重复与乱序。所谓的幂等性,就是Producer同样的一条数据,无论向Kafka发送多少次,kafka都只会存储一条。注意,这里的同样的一条数据,指的不是内容一致的数据,而是指的不断重试的数据。在这里面Kafka采用生产者分区id与序列号来区分数据。将生产者进行分区。然后加上数据与序列号来标识。
Broker会将最近的5批数据放到队列里面存储,按照倒序来排序
1.首先判断数据是否与队列里面的数据重复如果有就不就行操作
2在判断当前数据的序列号是否为队列的最后一个系列号加一如果是那么就表示为连续的。如果不是就就行报错并返回给生产者进行重新发送数据,这个时候会对队列数据进行排序。确保正确的顺序来就行接收数据。
3.当满足不重复与数据有序就可以正常接收数据队列尾部进去数据,头部保存数据到Broker。一个缓冲队里最大为5(压力测试)、
5.幂等性只能满足一个消费者分区的数据不重复与有序
生产者多分区域断点重连以后的生产者分区id会改变所以不能满足。需要开启事务来保证。
通过事务管理功能来管理生产者id,来确保事务开启以后生产者只能获取相同的生产者id。
Kafka引入事务协调器来管理事务并持久化保持到主题里面。基本原理就是事务id与生产者id绑定取保生产者只能拿到相同的生产者id,然后存储到专门管理事务的主题当中。
普通的数据操作发送数据,只要数据写入了日志,那么对于消费者来讲。数据就可以读取到了,但是事务操作发送数据中,如果数据写入了日志,但是没有提交的话,其实数据默认情况下也是不能被消费者看到的。只有提交后才能看见数据。