1.Kafka生产者Producer客户端的架构
producer架构整个生产者客户端有主线程和Sender线程(发送线程)。
主线程:由 KafkaProducer 创建消息,然后通过拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator消息收集器)。
Sender线程:获取RecordAccumulator的消息并将其发送到服务端。其中RecordAccumulator用于缓存消息以便 Sender 线程可以批量发送,进而减少网络传输的资源消耗以提升性能。
2.Kafka的拦截器、序列化器、分区器的作用和处理顺序
拦截器:两种拦截器-生产者拦截器和消费者拦截器。生产者拦截器用于在消息发送前做规则过滤、修改消息内容、统计等;同理,消费者拦截器用于提交消费位移前做定制化操作;
序列化器:生产者需要序列化器,把对象转换为字节数组;消费者需要反序列化器,把字节数组转转换为对象。
分区器:生产者为消息分配partition,根据 key 这个字段来计算 partition的值。
处理顺序 :拦截器->序列化器->分区器
3.Kafka生产者的分区策略
分区策略:轮询策略、随机策略、按消息键保序策略
4.Kafka保证消息的顺序性
通过按消息键保序策略,可以实现指定key的数据写入同一个partition,从而保证生产消息的顺序性。同时,该partition只能由一个消费者去消费,最终保证消息的顺序性。
说明:分区之间的消息是不保证有序的。
5.Kafka的事务性与幂等性的关系
(1)事务有以下三种级别:
最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输;
最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输;
精确的一次(Exactly once): 不会漏传输也不会重复传输;
Kafka事务性的目的是实现Producer幂等性
(2)Producer幂等性的实现
Kafka引入了Producer ID(即PID)和Sequence Number。每个新的Producer在初始化的时候会被分配一个唯一的PID,该PID对用户完全透明而不会暴露给用户。
①Producer客户端:对于每个Producer(PID),发送数据的每个<Topic, Partition>都对应一个从0开始单调递增的Sequence Number。
②Broker服务端:每个<PID, Topic, Partition>维护一个序号,并且每次Commit一条消息时将其对应序号递增。对于接收的每条消息,如果其序号比Broker维护的序号(即最后一次Commit的消息的序号)大一,则Broker会接受它,否则将其丢弃:情况一:如果消息序号比Broker维护的序号大一以上,说明中间有数据尚未写入,也即乱序,此时Broker拒绝该消息,Producer抛出InvalidSequenceNumber。情况二:如果消息序号小于等于Broker维护的序号,说明该消息已被保存,即为重复消息,Broker直接丢弃该消息,Producer抛出DuplicateSequenceNumber。
6.Kafka事务机制
事务过程(1)找到Transaction Coordinator
(2)获取PID
(3)开启事务
(4)Consume-Transform-Produce过程
(5)Commit或Abort事务
7.Kafka实现幂等的流程
没有幂等的流程:
没有实现幂等的流程实现幂等的流程:
实现幂等后的流程
网友评论