浅聊 kafka-如何保证生产数据不丢失方案?可用简单

  • 前述
  • 直接上方案


前述

kafka数据在生产的时候,出现数据丢失的情况,在我前面的文章中有说到,如果有不清楚的,可以去翻一翻,这篇适合有一定kafka使用经验的读者,并且这里只做方案,就不对细节进行说明啦,有疑问不清楚的,咱们评论区见,感谢。

该方案适合对消息有序性无要求,但需要保证消息完整性的场景。

直接上方案

一.为提高生产速度,send采用异步发送生产。

二.Ack设置为all,也就是当所有节点都返回确认信息后,才是成功

三.将kafka生产者的自动重试关闭,或把次数设置0.

四.send异步发送数据重写回调函数,根据回调,将发送失败的数据以key-value(根据业务来定)形式写入redis,其中会包括,topic,offset等数据。

五.采用定时任务,定时将redis数据重发,重发试要注意,数据一条条来,即读一条,发一条,发成功,删除redis对应记录,这样就算是send又失败了,这条数据也会重新写回redis,保证了数据最总的完整性。

六.上锁。考虑到大数据量问题,集群部署,可横向扩展,不上锁,这就会有分布式定时任务调度问题,即多台机子定时任务同时在跑,导致数据重复,使用分布式锁解决,这里有redis环境,就推荐直接使用基于redis的Redisson分布式锁,简单方便,快速。

这里的方案,提供一个大致的思路,更多的细节问题,可以一起探讨和发现,具体的方案,一切从实际业务出发,不然就是耍流氓,但是大多思路不变,变动的是细节。

热爱生活的码小子wmxiang:
工作之余,记录自己平时的一些小毛病,以及问题排查和解决方案思路。记录自己的经验和不足之处,笔记中可能会有很多不足之处,欢迎各位留言指正讨论。