kafka的消息交付语义 真的支持了最少一次吗?

1 背景

在读完kafka官方文档,kafka设计里的消息交付语义一章后,给我的第一印象是内容很抽象,于是草拟和总结了给个副标题,并把相关内容进行了归类;有些生涩的句子,尽量用大白话和举例进行说明,并加入了总结。 英文链接: kafka.apache.org/documentati...

消息交付语义的级别有哪些?

消息交付,即消息在生产端,broker端,消费者端的传递保证。

最多一次 ------消息可能会丢失,但永远不会重新传送。
至少一次 ------消息永远不会丢失,但可以重新传送。
恰好一次------这就是人们真正想要的,每条消息都传递一次且仅一次。

kafka 支持哪些消息交付语义?

根据英文文档,进行了总结

#######################以下为个人观点###########################

kafka 真的支持了 最少一次 的交付语义吗?

我的回答是:不同的条件下,可能支持了,也可能没支持。

kafka支持最少一次交付的前提条件

生产端:

kafka生产端在发送消息时,如果遇到底层网络问题,可能会导致消息发送给了broker端,也有可能网络闪断或者丢包,发送的消息可能丢了;但最后的结果是,生产端会根据指定的参数retries,进行一定次数的重试。以此来保证生产端,做到消息至少传递一次。即发送失败了,就重试吧。

所以生产端 支持"最少一次"的前提条件 有如下:

  • 生产端的应用在重试的时候,没有重启,或者宕机
  • 网络,或者broker端,需要在生产端重试次数用完之前恢复

消费者端:

消费者端保证消息至少被消费一次的建议是:在消费者端消费完消息后,在手工提交offset;伪代码如下:

bash 复制代码
while(true){ 
consumer.poll(); #①拉取消息  
XXX #②处理消息;  
consumer.commit();
}

具体原因和说明见:juejin.cn/post/729328...

broker端:

broker端,要实现此交付,主要是保证消息不丢。kafka 数据是具备高可靠的,但不代表你的kafka集群就具备了此功能。需要有如下配置:

第一:生产端参数 ack 设置为all

第二:在broker端 配置 min.insync.replicas参数设置至少为2

第三:在broker端配置 replicator.factor参数至少3

第四:在broker端配置 unclean.leader.election.enable 参数建议设置为false

具体原因和说明见:juejin.cn/post/729328...

不支持的情况下,如何去保证消息交付最少一次的保证

消费者端和broker端,可以根据配置和对应代码编写顺序进行解决;但生产端在进行重试时,还需依赖生产端应用的稳定性,底层网络和broker端的可用性;

生产端之所以需要这三个条件的支持,还是生产端没有把待发送消息进行持久化,毕竟待发送的消息是保存在jvm内存中的,jvm重启或者OOM或者宕机了,内存中的消息也就丢了;

如果把待发送的消息进行了持久化,即使应用宕机,网络失败,broker不可用,但在经过应用重启,网络和broker恢复,也可以保证待发送消息不丢失,做到消息的至少一次交付。

具体解决方法可参考:juejin.cn/post/729328...

相关推荐
高频因子挖掘机4 小时前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD9 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
鬼手点金11 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的11 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday12 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
余槐i12 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
朱涛的自习室12 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
需要82612 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡12 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
码艺-Alimjan12 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js