记一次关于位移提交的问题回答

简介: 对 Kafka 来说,它提供了手动位移提交的机制,可以暴露出来让用户自行实现位移的提交,也就意味着你可以对分区的位移有控制权,这完全取决于你本身的实现逻辑。

今晚撸得正兴奋时,有个朋友突然问了我一个关于位移提交的问题,他最近刚接触 Kafka,在一篇博客中看到了这么一段话:


640.png


然后他给我举了不是那么常规的一个问题,如下:

640.png


我一看问题就觉得有点奇怪了,我知道这个朋友肯定是从 RocketMQ 过来的,因为在 RocketMQ 的位移提交机制,只能是提交已消费的最小位移:


640.png


具体我有一篇文章专门详细地分析了 RocketMQ 的位移提交机制:RocketMQ 位移提交源码分析


因此,RocketMQ 是不会发生上面所说的情况。


我觉得产生这种疑惑是因为之前使用 RocketMQ 的时候,由于不用自己处理位移提交,一切交给 RocketMQ 处理了,而恰好 RocketMQ 提交位移的机制只能提交未消费最小偏移量以杜绝消息的丢失,导致了这位朋友切换到 kafka 需要手动处理位移的时候,产生了以上的困惑。


对 Kafka 来说,它提供了手动位移提交的机制,可以暴露出来让用户自行实现位移的提交,也就意味着你可以对分区的位移有控制权,这完全取决于你本身的实现逻辑。


如果是按照例子的描述操作,此时分区最新消费偏移量就是 7 消息的位移,因为 Kafka 它本身并没有重试对列机制,基于这个前提下,如果这条消息消费失败了,要么你客户端捕捉到再进行重试消费,要么就丢弃,消费后面的消息,并提交消费位移,一切都往前看,要不然你会阻塞后面的消费。此时,4 消息就丢失了。


可以这么解决:


自己实现一个与 RocketMQ 位移提交机制的 TreeMap 来存储消息,位移作 key,每次消费完移除,提交位移的时候只提交最小位移就好了,比如这个例子,只能提交 3 消息的位移。

相关文章
|
3月前
|
缓存 NoSQL 算法
扛住亿级流量的核心防线:限流、熔断、降级全链路深度拆解与实战
本文系统讲解分布式系统亿级流量治理,涵盖限流(固定/滑动窗口、漏桶、令牌桶及Redis分布式实现)、熔断(状态机、Resilience4j实战)与降级(功能开关、读/写降级)三大核心能力,并提供全链路分层架构、生产避坑指南与最佳实践,助力系统稳定扛压。
553 2
|
Linux Python
在Linux下升级到Python3的两种方法
在Linux下升级到Python3的两种方法
2252 0
|
消息中间件 设计模式 Java
聊聊 Kafka: Consumer 源码解析之 Rebalance 机制
聊聊 Kafka: Consumer 源码解析之 Rebalance 机制
1106 0
|
存储 消息中间件 数据安全/隐私保护
RocketMq Topic创建和删除
RocketMq Topic创建和删除
5975 0
|
前端开发 安全 开发者
【通义灵码实践】实现经典手机游戏推箱子
本文介绍了使用通义灵码辅助实现经典推箱子游戏的过程。首先,通过输入“用Python写一个推箱子游戏”,灵码生成了基本的终端版本代码,包括地图渲染、玩家移动和胜利检测等功能。然而,终端版本交互体验不佳。为了解决这一问题,再次输入“不要在终端上运行,希望可以在页面上运行”,灵码生成了基于Flask的后端代码和HTML前端代码,实现了网页版推箱子游戏。最终结果展示了游戏的完整实现,包括前后端交互和用户界面。总结中提到,该方法具有快速生成代码、代码质量高、易于扩展等优点,但也存在功能简单、样式和用户体验有限、错误处理不足等问题,适合快速原型开发和教学演示。
670 2
|
消息中间件 缓存 负载均衡
复盘女朋友面试4个月的RocketMQ面试题
这篇文章复盘了面试中关于RocketMQ的高频题目,包括架构组成、使用姿势、功能原理及高级特性,并强调了理解这些实现机制对于面试成功的重要性。
复盘女朋友面试4个月的RocketMQ面试题
|
存储 NoSQL 关系型数据库
你应该知道一些其他存储——列式存储
你应该知道一些其他存储——列式存储
575 2
|
存储 分布式计算 Hadoop
|
Java 数据安全/隐私保护 开发者
项目实践《学生信息管理系统》
项目实践《学生信息管理系统》
|
Java jenkins 测试技术
常见自动化测试框架和工具
常见自动化测试框架和工具
629 0