问题
向kafka写数据,然后读kafka数据,生产的数据量和消费的数据量对不上。
开始怀疑人生,以前奠定的基础受到挑战。。。
原来的测试为什么没有覆盖生产量和消费量的对比?
消费者写的有问题?反复检,无果。。。
再反过来梳理生产者的代码,检查了几遍,也并无发现疏漏。
开始怀疑Kafka
以前看过文章,说kafka数据有可能重复和丢失数据,难道kafka的这么不精确,丢了这么多数据?
原因
最后排查到生产者,kafka生产者使用confluent-kafka-go。
向kafka生产数据的伪代码如下:
type Message struct {
Content []byte
}
message = &Message{}
for {
content = getFromQ()
message.Content =content
Send(message)
}
这段代码是有问题的。
Send()操作不是直接发送出去,而是放入一个队列,这样,如果队列数据发送前,下一次循环再次调用
message.Content =content
会将原来的content覆盖掉,就会出现写入kafka的数据存在重复。并且如果前一次数据长度大于下一次数据长度,后者覆盖前者,消费量就会小于生产量。
解决办法
需要将代码修改为:
type Message struct {
Content []byte
}
for {
content = getFromQ()
message = &Message{}
message.Content =content
Send(message)
}
每次发送消息时,重新定义一个变量保存数据,这样就不会出现覆盖问题。
关于confluent-kafka-go如何生产数据可参考
https://blog.csdn.net/lanyang123456/article/details/78377152
参考
kafka丢数据和数据重复
https://blog.csdn.net/xinlangtianxia/article/details/51387689
kafka重复消费解决方案
https://blog.csdn.net/qq_16583617/article/details/79648221
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现