1. 生产者如何保证数据不丢失

ACK机制:当生产者将数据生产到Broker后,Broker给予一个ack确认响应。

ack=0:生产者只管发送数据, 不关心不接收Broker给予的响应。

ack=1:生产者将数据发送到Broker端, 需要等待Broker端对应的Topic上对应分片上的主副本接收到消息后, 才认为发送成功了。

ack=-1|ALL:生产者将数据发送到Broker端, 需要等待Broker端对应的Topic上对应分片上的所有的副本都接收到消息后, 才认为发送成功了。

如果Broker没有给予ACK响应,需要设置超时时间, 超时触发重试策略, 如果多次重试依然无法解决, 程序则报错。


每发送一次数据Broker就要给予一次ACK响应,会对网络带宽产生影响,可以引入缓存池, 满足一批数据后, 异步发送给Broker端, Broker端只需要针对这一批数据给予一次响应即可

通过。


如果缓存池中数据已经满了,但Broker没有给予响应,可以选择清空缓存池或不清空,如果数据是可重复读的,那么直接让程序报错即可,通知处理后, 直接再重新读取发送即可, 如果数据不是可重复读,为了避免这个问题的发生,我们可以将生产的数据在其他的位置也写一份,当数据生产成功,那么就删除其中相关数据,如果生成失败,后续从对应位置上在重新拉取处理即可,如果选择不清空, 那么阻塞写入, 一直等待即可。

相关配置:

  1. buffer.memory:缓存池的大小,默认值:33554432(32M)
  2. 重试次数:
  1. retries:重试次数,默认值 2147483647,但是最终重试不完全取决于此参数
  2. delivery.timeout.ms:一次发送数据总的超时时间,默认值为120000(120s)
  3. request.timeout.ms:一次请求的超时时间,默认值为30000(30s)
  4. 最终重试次数:(delivery.timeout.ms / request.timeout.ms) -1
  1. 一批数据阈值:大小或时间满足哪个执行哪个
  1. batch.size:一批数据的大小,默认值 16384(16kb)
  2. linger.ms:每一批次的间隔时间,默认值 0

2. Broker端如何保证数据不丢失

磁盘存储+多副本+ACK为-1

3. 消费端如何保证数据不丢失

  1. 当consumer启动后,连接Kafka,根据group.id到Kafka中寻找上一次消费到什么位置。
  2. 如果consumer找到了上次消费位置,接着从这个位置开始消费数据,如果没有找到上一次消息的位置,说明第一次来,这时默认从当前时刻开始消费数据,消费的位置也从当前这个消息的偏移量位置开始。
  3. 消费者开始消费数据,在消费的过程中,每消费完数据后都要和Kafka进行汇报,汇报当前消费到了哪一个偏移量信息。