一、生产者程序丢失数据
消息大小超过Broker的message.max.bytes的值,Broker会直接返回错误;消息的格式错误;网络的瞬时抖动都可能造成生产者程序的数据没有发送到Broker;分区首领副本挂了等
生产者采用producer.send(ProducerRecord record)导致数据发送后不管Broker是否接收到继续其他业务,都可能会出现上述丢失数据的场景。因此,需要使用producer.send(ProducerRecord record, CallBack callback)发送数据,发送失败时,Producer可以继续处理错误。
Producer的max.requests.size表示生产者发送的单个消息的最大值,也可以指单个请求中所有消息的总和大小。此值必须小于Broker的message.max.bytes,能够有效的避免消息大小超限;网络抖动导致发送消息瞬时失败,采用retries+retry.backoff.ms对消息进行重试发送。如果消息是存在顺序的,就需要配置max.in.flight.requests.per.connection=1,避免重试带来的消息乱序。
二、消费者程序丢失数据
属性enable.auto.commit决定分区偏移量提交的策略,值为false时,手动控制提交偏移量。consumer.commitSync()和consumer.commitAsync()、consumer.commitAsync(new OffsetCommitCallBack())分别为同步提交和异步提交。同步提交会一直重试直到成功,需要Broker的响应,而异步提交能够提高吞吐量。
当先提交偏移量,后处理消息时,当消息处理失败时,该消息将被丢失。