Kafka(一) 生产者- producer详解

1、消息发送流程


两种方式:同步发送和异步发送,涉及到了两个线程(main线程和sender线程)和一个线程共享变量(RecordAccumulator),main线程将数据发送至RecordAccumulator,Sender线程不断从RecordAccumulator中拉取消息发往broker。
1)同步发送:一条消息发送之后,线程会阻塞,直到ack返回
2)异步发送:指的是将外部的数据发送到RecordAccumulator的过程,不关心DQueue中的数据是否已经发送到broker

核心参数配置:
batch.size – 消息大小积累到达该值时,sender线程才会发送消息数据,默认16K
linger.ms – 若消息大小迟迟未达到batch.size,sender线程等待linger.ms时长后发送消息数据,默认0,表示没有延迟

2、分区策略


原因:方便集群拓展,每个topic由多个Partition组成,因此整个集群可以适应任意大小的数据。同时可以提高消息的写入和读取速度。生产者可以以分区为单位进行并行发送数据,消费者可以以分区为单位进行消费数据。
原则:
        1、指定partition情况下,数据写入该partition
        2、没有指定partition,但设置了key的情况下,将key的hash值与topic的partition数量进行取余计算partition
        3、未指定partition和key,采用Sticky Partition(粘性分区器),随机选择一个,并尽量一直使用,直到batch已满,再随机一个分区(和 上一次 不同)
如何自定义分区?
        1、定义类实现Partitioner接口
        2、重写partition()方法

3、数据可靠性保证(可靠条件=ACK级别设置为-1 + 分区副本大于1 + ISR应答最小副本数量大于1)

                  1、ACK确认机制
                        -1(all) Leader和ISR队列里所有节点收到后应答,可靠性高,效率低
                        0: 生产者发送后就不管了,效率高,可用性差
                        1: Leader应答,可靠性、效率中等

                  2、ISR(in-sync replica 
                        意为和 leader 保持同步的 follower 集 合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower 长时间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。需要注意,leader是从AR中按照顺序选取出来存活在ISR中的节点。

                  3、broker故障细节处理
                        

                           1)follower故障,踢出ISR,待恢复后从本地磁盘读取上次记录的HW,并将log文件高于HW部分截取,从HW部分开始从leader进行同步,等此LEO大于该partition的HW后重新加入ISR
                           2)leader故障,会从ISR中选择一个leader,为了保证多个副本数据一致性,其余follower将各自高于HW部分进行截取,从新的leader开始同步数据,只能保证副本之间数据一致性,不能保证数据不丢失或者不重复          

4、Exactly Once 语义

                 At Least Once:将服务器的 ACK 级别设置为-1,可以保证 Producer 到 Server 之间不会丢失数据

                 At Most Once:将服务器 ACK 级别设置为 0,可以保证生产者每条消息只会被 发送一次

                 Exactly Once(精确一次):At Least Once(ack=-1 + 分区副本>1 + ISR最小副本量>1) + 幂等性(Producer不论向broker发送多少次重复数据,Broker只会持久化一条,保证不重复) 

具有<PID, Partition, SeqNumber>相同的主键提交时,Broker只会持久化一次,PID是Kafka启动时自动分配,Partition表示分区号,Sequence Number是单调递增,所以幂等性只能保证单分区单会话内不重复。解决方案:引入事物。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值