![44c3c3bf8712a41e92e956dbe7867b45.png](https://i-blog.csdnimg.cn/blog_migrate/ae10ff363e539b24b1cf6f3110cd80fa.jpeg)
背景
这里的kafka值得是broker,broker消息丢失的边界需要对齐一下:
1 已经提交的消息
2 有限度的持久化
如果消息没提交成功,并不是broke丢失了消息;
有限度的持久化(broker可用)
生产者丢失消息
producer.send(Object msg) ;
这个发送消息的方式是异步的;fire and forget,发送而不管结果如何;
失败的原因可能有很多,比如网络抖动,发送消息超出大小限制;
怎么破呢?永远使用带有返回值值的消息发送方式,即 producer.send(msg,callback)
通过callback可以准确的告诉你消息是否发送成功了,发送失败了你也可以有处置方法;
网络抖动: 重发
发送消息超出大小:调整消息大小进行发送
这种情况并不是broker丢失消息了,是producer的消息没有提交成功。
消费者丢失消息
kafka消费消息的模型:
![26208e7f2ecf822ce9bcd5010ca83ef7.png](https://i-blog.csdnimg.cn/blog_migrate/fbb0e1250b454788c1b1d2bc93574320.jpeg)
即消费消息,设置好offset,类比一下:
![c32cff27063598f81b4c1226d922d26c.png](https://i-blog.csdnimg.cn/blog_migrate/e6b84331be9e201628a44b73986a7a8b.jpeg)
说明时候消费者丢失数据呢?即先更新位移,再消费消息,如果消费程序出现故障,没消费完毕,则丢失了消息,此时,broker并不知道。
怎么破?总是先消费消息,再更新位移;这种可能带来消息重复消费的问题,但是不会出现消息丢失问题;
多线程消费丢失消息
即开启了位移自动提交,多线程处理的时候,如果有一个线程出现问题,但是还是提交了位移,会发生消息丢失。
怎么破? 关闭自动提交位移,消费者端配置参数:enable.auto.commit=false
调优broker参数防止消息丢失
主要通过调整配置来保证kafka消息不丢失。
![f407cd16855cd75046381e0af8a55e5b.png](https://i-blog.csdnimg.cn/blog_migrate/d1333863dd03ae6c8d95baea45796bb3.jpeg)
然后就是producer发送消息一定要使用带回调函数的方法,并对发送失败的情况进行处理。
同时写consumer程序的时候先消费再提交;
小结
本节先限定了kafka消息不丢失是针对broker的,基本要求是:消息已提交到broker,而且至少有一个broker可用;
然后从生产者,消费者,配置参数这三个方面介绍了如何防止kafka的消息丢失。