Producer端
在谈论kafka生产者发送消息是否无序和丢失之前,我们先来了解一下生产者三种发送消息的模式以便于我们更好的理解数据丢失和数据乱序的原因和如何避免消息丢失和乱序。
当参数acks和retries设置不为0时,只要send(record)就会重试,重试的次数和参数reties有关,和同步异步无关。
发送并忘记:producer.send(record):参数acks不设置为0,且参数retries大于0,就会触发重试,重试的次数和retries设置的大小有关。
同步发送消息:producer.send(record).get():调用Future对象的get方法就会一直等待sender线程发送一批消息后的响应。
异步发送消息:producer.send(record , callback):当参数acks和retries设置不为0时,发送失败则会继续重试, callback对象可以处理不可重试的异常。
总结:发送并忘记和异步发送消息的区别在于异步发送消息可以处理不可重试的异常;同步发送消息和异步发送消息的区别在于同步发送消息会等待Kafka响应而异步在发送消息以后可以不用等待响应,能够接着处理其他任务。
了解到这你们可能会疑惑,这些模式和数据丢失和乱序有什么关联,下面的内容将是基于同步和异步模式来展开kafka数据丢失和数据乱序的原因。
消息丢失和乱序的原因
上述的模式都是基于参数acks和retries不为0的情况,那么我们来设想一下以下几种情况:
0.如果acks为0,同步发送消息将不和Kafka集群进行消息接受确认,当网络发生异常等情况时,将会存在消息丢失的可能。(笔者暂未知道这个是否会有消息丢失的可能,欢迎指教)
1.在使用同步发送消息时我们将参数acks设为1(即只保证写入leader成功),如果刚好leader partition挂了,数据就会丢失。