生产者丢失消息
生产者(Producer) 调用send
方法发送消息之后,消息可能因为网络问题并没有发送过去。Kafka提供了同步发送消息方法,会返回一个Future对象,调用get()方法进行阻塞等待,就可以知道消息是否发送成功。
如果消息发送失败的话,可以通过Producer 的retries
(重试次数)参数进行设置,当出现网络问题之后能够自动重试消息发送,避免消息丢失。另外,建议还要设置重试间隔,因为间隔太小的话重试的效果就不明显
消费者丢失消息
消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。偏移量(offset)表示 Consumer 当前消费到的 Partition(分区)的所在的位置。Kafka 通过偏移量(offset)可以保证消息在分区内的顺序性。
当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。
可以通过enable.auto.commit设置为false,关闭闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset 。
broker丢失消息
当消息发送到了分区的leader副本,leader 副本所在的 broker 突然挂掉,那么就要从 follower 副本重新选出一个 leader ,但是 leader 的数据还有一些没有被 follower 副本的同步的话,就会造成消息丢失。
解决办法就是将producer设置 acks = all。
ack = 0, 生产者在成功写入消息之前不会等待任何来自服务器的相应,就是如果broker没有收到消息,生产者也是无法得知。
acks =1,代表我们的消息被leader副本接收之后就算被成功发送。
acks = all,代表则所有副本都要接收到该消息之后该消息才算真正成功被发送。