美文网首页
【Kafka系列】3.1 生产者Producer

【Kafka系列】3.1 生产者Producer

作者: 熊本极客 | 来源:发表于2020-07-28 23:05 被阅读0次

    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)CommitAbort事务

    7.Kafka实现幂等的流程

    没有幂等的流程:

    没有实现幂等的流程

    实现幂等的流程:

    实现幂等后的流程

    相关文章

      网友评论

          本文标题:【Kafka系列】3.1 生产者Producer

          本文链接:https://www.haomeiwen.com/subject/axaqrktx.html