往往排查很久的问题,最后发现都非常简单。。。

文章讲述了在集成Kafka客户端后,线上出现大量RetriableCommitFailedException异常,集中在灰度环境中。通过流量检查、Broker负载分析和日志排查未找到明显原因。在无法复现问题和怀疑网络环境后,分析了异常的重试机制,发现同步提交和异步提交的差异可能导致问题。最终,通过将灰度实例的提交方式改为同步可重试解决异常,避免了位移覆盖和重复消费的问题。

之前线上发生了一个很诡异的异常,网上各种搜索、排查,都没有找到问题,给大家分享一下。

大概在 2 月份的时候,我们的某个应用整合了中间件的 kafka 客户端,发布到灰度和蓝节点进行观察,然后就发现线上某个 Topic 发生了大量的RetriableCommitException,并且集中在灰度机器上。

E20:21:59.770 RuntimeException  org.apache.kafka.clients.consumer.RetriableCommitFailedException  ERROR [Consumer clientId=xx-xx.4-0, groupId=xx-xx-consumer_[gray]] Offset commit with offsets {xx-xx-xx-callback-1=OffsetAndMetadata{offset=181894918, leaderEpoch=4, metadata=''}, xx-xx-xx-callback-0=OffsetAndMetadata{offset=181909228, leaderEpoch=5, metadata=''}} failed org.apache.kafka.clients.consumer.RetriableCommitFailedException: Offset commit failed with a retriable exception. You should retry committing the latest consumed offsets.
Caused by: org.apache.kafka.common.errors.TimeoutException: Failed to send request after 30000 ms.
复制代码

排查

检查了这个 Topic 的流量流入、流出情况,发现并不是很高,至少和 QA 环境的压测流量对比,连零头都没有达到。

但是从发生异常的这个 Topic 的历史流量来看的话,发生问题的那几个时间点的流量又确实比平时高出了很多。

同时我们检查 Broker 集群的负载情况,发现那几个时间点的 CPU 负载也比平时也高出很多(也只是比平时高,整体并不算高)。

对Broker集群的日志排查,也没发现什么特殊的地方。

然后我们对这个应用在QA上进行了模拟,尝试复现,遗憾的是,尽管我们在QA上把生产流量放大到很多倍并尝试了多次,问题还是没能出现。

此时,我们把问题归于当时的网络环境,这个结论在当时其实是站不住脚的,如果那个时刻网络环境发生了抖动的话,其它应用为什么没有这类异常?

可能其它的服务实例网络情况是好的,只是发生问题的这个灰实例网络发生了问题。

那问题又来了,为什么这个实例的其它 Topic 没有报出异常,偏偏问题只出现在这个 Topic 呢?。。。。。。。。。

至此,陷入了僵局,无从下手的感觉。

从这个客户端的开发、测试到压测,如果有 bug 的话,不可能躲过前面那么多环节,偏偏爆发在了生产环境。

没办法了,我们再次进行了一次灰度发布,如果过了一夜没有事情发生,我们就把问题划分到环境问题,如果再次出现问题的话,那就只能把问题划分到我们实现的 Kafka 客户端的问题了。

果不其然,发布后的第二天凌晨1点多,又出现了大量的 RetriableCommitFailedException,只是这次换了个 Topic,并且异常的原因又多出了其它Caused by 。

org.apache.kafka.clients.consumer.RetriableCommitFailedException: Offset commit failed with a retriable exception. You should retry committing the latest consumed offsets.
Caused by: org.apache.kafka.common.errors.DisconnectException
...
...
E16:23:31.640 RuntimeException  org.apache.kafka.clients.consumer.RetriableCommitFailedException  ERROR 
...
...
org.apache.kafka.clients.consumer.RetriableCommitFailedException: Offset commit failed with a retriable exception. You should retry committing the latest consumed offsets.
Caused by: org.apache.kafka.common.errors.TimeoutException: The request timed out.
复制代码

分析

这次出现的异常与之前异常的不同之处在于:

  1. 1. Topic 变了
  2. 2. 异常Cause变了

而与之前异常又有相同之处:

  1. 1. 只发生在灰度消费者组
  2. 2. 都是RetriableCommitFailedException

RetriableCommitFailedException 意思很明确了,可以重试提交的异常,网上搜了一圈后仅发现StackOverFlow上有一问题描述和我们的现象相似度很高,遗憾的是没人回复这个问题:StackOverFlow。

我们看下 RetriableCommitFailedException 这个异常和产生这个异常的调用层级关系。

除了产生异常的具体 Cause 不同,剩下的都是让我们再 retry,You should retry Commiting the lastest consumed offsets。

从调用层级上来看,我们可以得到几个关键的信息,commit 、 async。

再结合异常发生的实例,我们可以得到有用关键信息: 灰度、commit 、async。

在灰度消息的实现上,我们确实存在着管理位移和手动提交的实现。

看代码的第 62 行,如果当前批次消息经过 filter 的过滤后一条消息都不符合当前实例消费,那么我们就把当前批次进行手动异步提交位移。结合我们在生产的实际情况,在灰度实例上我们确实会把所有的消息都过滤掉,并异步提交位移。

为什么我们封装的客户端提交就会报大量的报错,而使用 spring-kafka 的没有呢?

我们看下Spring对提交位移这块的核心实现逻辑。

可以同步,也可以异步提交,具体那种提交方式就要看 this.containerProperties.isSyncCommits() 这个属性的配置了,然而我们一般也不会去配置这个东西,大部分都是在使用默认配置。

人家默认使用的是同步提交方式,而我们使用的是异步方式。

同步提交和异步提交有什么区别么?

先看下同步提交的实现:

只要遇到了不是不可恢复的异常外,在 timer 参数过期时间范围内重试到成功(这个方法的描述感觉不是很严谨的样子)。

我们在看下异步提交方式的核心实现:

我们不要被第 645 行的 RequestFuture future = sendOffsetCommitRequest(offsets) 所迷惑,它其实并不是发送位移提交的请求,它内部只是把当前请求包装好,放到 private final UnsentRequests unsent = new UnsentRequests(); 这个属性中,同时唤醒真正的发送线程来发送的。

这里不是重点,重点是如果我们的异步提交发生了异常,它只是简单的使用 RetriableCommitFailedException 给我们包装了一层。

重试呢?为什么异步发送产生了可重试异常它不给我们自动重试?

如果我们对多个异步提交进行重试的话,很大可能会导致位移覆盖,从而引发重复消费的问题。

正好,我们遇到的所有异常都是 RetriableCommitException 类型的,也就是说,我们把灰度位移提交的方式修改成同步可重试的提交方式,就可以解决我们遇到的问题了。

<think>好的,用户现在的问题是为什么重启很久还没开机。之前他们问了如何安装WSL,现在突然转到了系统启动问题,可能需要先理解他们的使用场景。用户可能是在安装WSL之后遇到了系统启动变慢的问题,或者是在其他情况下遇到了开机问题。 首先,我需要考虑用户可能的具体情况。安装WSL需要启用Windows功能并重启,可能用户在执行重启时发现系统卡在启动界面很久,无法进入系统。这时候,用户可能对系统启动过程不了解,需要解释可能的原因和解决方法。 接下来,分析可能的原因。硬件问题比如硬盘故障、内存问题,或者软件层面的驱动冲突、系统文件损坏、更新失败等。另外,安装WSL后可能涉及到虚拟化或Hyper-V的启用,可能与某些硬件或软件不兼容,导致启动变慢。 用户可能对计算机硬件和系统不太熟悉,需要以简单明了的方式列出可能的原因,并提供解决步骤。同时,用户可能需要紧急解决问题,所以需要给出安全模式进入方法,以及如何排查问题。 还需要注意用户的潜在需求,比如他们可能想自己尝试修复,而不是直接送修,所以提供详细的步骤,比如检查硬盘、内存,进入安全模式禁用最近安装的软件或驱动,特别是与WSL相关的组件。 另外,考虑到用户之前安装了WSL,可能需要检查是否在启用WSL或Hyper-V后与其他虚拟化软件(如VMware、VirtualBox)产生冲突,导致启动延迟。这也是一个可能的原因,需要提醒用户。 最后,要确保回答结构清晰,分点说明可能的原因和解决方法,同时给出预防措施,帮助用户未来避免类似问题。如果用户无法自行解决,建议联系专业人士,避免进一步损坏系统。</think>当计算机重启后长时间无法完成开机,可能由多种原因导致。以下是常见原因及排查方法: --- ### 一、硬件问题 1. **硬盘故障** - **现象**:开机卡在主板LOGO界面或黑屏,伴随硬盘异响。 - **检查方法**: - 进入BIOS查看硬盘是否被识别(开机时按 `Del/F2/F10` 等键)。 - 使用硬盘检测工具(如CrystalDiskInfo)检查健康状态。 2. **内存接触不良** - **现象**:开机后无显示或反复重启。 - **解决方法**: - 断电后重新插拔内存条,用橡皮擦拭金手指。 3. **电源供电不足** - **现象**:风扇转动但无显示,或突然断电。 - **排查**:尝试更换电源或检查电源线连接。 --- ### 二、软件或系统问题 1. **系统更新卡死** - **现象**:屏幕显示“正在配置更新”或进度条长时间停滞。 - **解决方法**: - 强制关机再开机,系统可能回滚更新(需多次尝试)。 2. **驱动程序冲突** - **现象**:安装新硬件驱动后首次重启卡顿。 - **解决步骤**: 1. 进入安全模式(开机时按 `Shift + 重启` → 疑难解答 → 启动设置 → 重启后按 `F4`)。 2. 在安全模式中卸载最近安装的驱动。 3. **文件系统损坏** - **修复方法**: - 使用Windows安装U盘启动,选择“修复计算机” → 命令提示符,输入: ```cmd chkdsk C: /f /r sfc /scannow ``` --- ### 三、其他可能原因 1. **外设干扰** - 拔掉所有非必要外设(如U盘、打印机),仅保留键鼠和显示器。 2. **病毒/恶意软件** - 进入安全模式运行杀毒软件全盘扫描。 3. **BIOS设置错误** - 重置BIOS至默认设置(进入BIOS后选择 `Load Default Settings`)。 --- ### 四、紧急处理步骤 1. **强制关机并重试** - 长按电源键10秒强制关机,等待30秒后重新开机。 2. **使用最后一次正确配置** - 开机时按 `F8`(部分机型需通过高级启动菜单进入),选择“最后一次正确的配置”。 --- #### 若以上方法无效: - **备份数据**:通过PE系统(如微PE工具箱)进入临时系统备份文件。 - **重装系统**:作为最后手段,使用U盘安装介质重装Windows。 #### 预防措施: - 定期清理磁盘冗余文件。 - 避免非正常关机(直接断电)。 - 安装驱动时选择官方稳定版本。 如果问题持续,建议联系专业维修人员检查硬件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值