分区策略

  1. 指明partition的情况下,直接将指明的值作为partition值
  2. 没有指明partition值但是有key情况下,将key的hash值与topic的partition数进行取余得到partition值
  3. 既没有partition又没有key的情况下,第一次调用产生一个随机整数,然后每次调用会在这个整数上递增,将这个值与topic可用的partition总数取余得到partition值,也就常说的 round-robin(轮询) 算法

数据可靠性保证

  1. 两种策略
  • 同步半数副本,那么保证数据不丢失需要2n+1个副本
  • 同步全部副本,那么保证数据不丢失需要n+1个副本

kafka采用同步全部副本
并且优化加入ISR(同步副本)策略,保证如果有一个副本出现不能同步或者同步缓慢而迟迟不能发送ack命令的策略(如果follower长时间未向leader同步数据,则该follower将被踢出ISR,时间阈值由replica.lag.time.max.ms参数设定。) 当Leader发生故障之后,就会从ISR中选区新的leader

  1. ISR(同步副本)
    TODO

  2. acks应答机制 参数配置:

  • acks:0
    producer不等待broker的ack,提供了最低延迟,broker一接受还没写入磁盘就返回,那么会丢失数据
  • acks:1
    producer等待broker的ack,Partition的Leader回落后返回ack,如果在follower同步成功前leader发生故障,那么会丢失数据
  • acks:-1或all
    producer等待broker的ack,所有follower同步成功后返回ack
    • 但是如果follower同步成功但是还没有发送ack的时候 leader坏掉了,这时候重新选举leader,选举成功后会再次发送消息,会造成消息重复
    • 如果ISR副本个数为1的时候 ack设置为all还可能会丢数据

以上的follower都是ISR同步副本中的follower

ExactlyOnce 精准一次性

  1. At least once 至少一次 acks: -1
    可以保证数据不丢失,不能保证数据不重复
  2. At Most once 至多一次 acks: 0
    可以保证数据不重复,不能保证数据不丢失
  3. Exactly Once
    不重复也不丢失,采用幂等性。0.11之前,采用消费者段进行去重
    配置文件设置 enable.idompotence=true 即可以开启幂等性

生产者在初始化的时候分配一个PID,发往同一Partition的消息会带有Sequence Number。
而且Broker会对<PID,Partition,SeqNumber>做缓存,相同主键提交时候,Broker只会持久化一条。
缺点《生产者,重启后数据还会重复》1