producer 数据不丢失:
-
同步模式:配置=1 (只有Leader收到,-1 所有副本成功,0 不等待)Leader Partition挂了,数据就会丢失
解决:设置 -1 保证produce 写入所有副本算成功producer.type = sync request.required.acks=-1
-
异步模式,当缓冲区满了,如果配置为0(没有收到确认,一满就丢弃),数据立刻丢弃
解决:不限制阻塞超时时间。就是一满生产者就阻塞
producer.type = async
request.required.acks=1
queue.buffering.max.ms=5000
queue.buffering.max.messages=10000
queue.enqueue.timeout.ms = -1
batch.num.messages=200
Customer 不丢失数据
- 在获取kafka的消息后正准备入库(未入库),但是消费者挂了,那么如果让kafka自动去维护offset它就会认为这条数据已经被消费了,那么会造成数据丢失。
解决:使用kafka高级API,自己手动维护偏移量,当数据入库之后进行偏移量的更新(适用于基本数据源)
流式计算。高级数据源以kafka为例,由2种方式:receiver (开启WAL,失败可恢复) director (checkpoint保证)
流处理中的几种可靠性语义:
-
at most once 每条数据最多被处理一次(0次或1次),会出现数据丢失的问题
-
at least once 每条数据最少被处理一次(1次或更多),这个不会出现数据丢失,但是会出现数据重复
-
exactly once 每种数据只会被处理一次,没有数据丢失,没有数据重复,这种语义是大家最想实现的,也是最难实现的
但是开启WAL后,依旧存在数据丢失问题,原因是任务中断时receiver 也被强行终止了,将会造成数据丢失
在Streaming程序的最后添加代码,只有在确认所有receiver都关闭的情况下才终止程序