java项目线上捉BUG经验记录

一 线上问题

        昨晚上突然接到公司紧急来电电桩设备大面积离线,意味着某市的车无法充电……”,细想这个平台很久都没有更新,最近出现问题是刚好在一个月前也是出现这种情况,再上一次就是几年前更新的。平台平时是稳定,开始找BUG ……

二 线上分析

1 查项目运行日记

整个充电桩平台两台线上云服务器十多个java项目服务开始排查,由于整个项目都是由本人设计并负责核心的开发所以很快就定位服务器和出问题的服务,查该服务日记,发现大量的报错如下图:

看到是MQ报的错,一堆事物未确认回滚的错误,马上想到队列存在积压问题,访问web管理平台查看队列情况,发现阻塞有几千设备发的消息。立马清除通道不保不延迟(设备要求不可以延迟),发现队列恢复正常。观察一几分种后又开始有堆积的现象,消费端出了问题,除了队列异常项目没有明显出错信息。

2 查服务器流量:

查流量,发现网络流量异常如下图:

 

波动如此大,基本确定与网络传送有关联。在查询端口报文数据分析也排除外网被攻击,很可能是报文实时分发环节出了问题,设备报文发送到另一家公司系统(业务要求桩设备上传的数据,实时上到另外一家公司,用于核查数据)。

3 查项目运行状态:

问题项目cpu每间隔一段时间占用很高如下图:

在升高的时候查看栈信息

jstack 22561 |grep 'pole'

说明:  jstack 是查看java项目运行中的一些栈信息, grep 是过滤内容,不然输出信息太多看不了这么多,pole是本项目的相关代码内容,如果不了解项目代码也可以用Excption或Error代替。

 找到相关代码(太急了没截到图),代码功能正是报文实时分发部分,也与上面流量分析相应证,为了再次确定,马上把分发代码注释,编译打包,重新发布项目后恢复正常。

4 优化代码,顺便解决历史安全问题

在协议处理实时分发关键代码(未修改前):

 try {
         
            String time=TimeFormatUtils.getTimeStrBy_yyyyMMddHHmmss(now);
            String txtTime=org_hex.concat("$$").concat(time)        
          
            RedisTemplate sec= SecondRedisConnection.getSecondRedisTemplate();
            sec.opsForList().leftPush("PUSH_TO_DB",txtTime);

            return true;
        } catch (Exception e) {
            logger.error("分发报文错误", e);
            return false;
        }

在协议处理实时分发代码分离,不再实时处理(2秒以上延迟),交由专门的任务线程处理,代码修改后:

      try {


            String txtTime = org_hex.concat("$$").concat(time);
            MemDataTable.HEX_PUSH_HEX.offer(txtTime);
            return true;
        } catch (Exception e) {
            logger.error("分发报文错误", e);
            return false;
        }
  public final static ArrayBlockingQueue<String> HEX_PUSH_HEX =new ArrayBlockingQueue<String>(300000);

  public static boolean sendDbRedis = true;



 public static long sendErr = 0;
    /**
     * 每2秒执行一次
     */
    @Scheduled(cron = "*/2 * * * * *")
    public void scheduled() {



        if (MemDataTable.HEX_PUSH_HEX.size() > 0) {
            RedisTemplate sec = SecondRedisConnection.getSecondRedisTemplate();

            while (MemDataTable.HEX_PUSH_HEX.peek()!=null) {
                String hex=MemDataTable.HEX_PUSH_HEX.poll();
                if (sendDbRedis) {
                    try {
                        sec.opsForList().leftPush("PUSH_HEX", hex);
                        sendErr=0;
                    } catch (Exception e1) {
                        logger.error("分发报文错误", e1);
                        logger.error("分发报文异常 hex="+hex, e1);

                        if(sendErr>10){
                            sendDbRedis = false;
                            logger.error("分发报文终止 hex="+hex, e1);
                        }
                        sendErr++;
                    }

                }else{
                    logger.error("====================分发报文,放弃:"+MemDataTable.HEX_PUSH_HEX.size());
                    MemDataTable.HEX_PUSH_HEX.clear();
                }
            }

        }

    }

代码分隔后,可以保证第三方网络断开与网络速度慢时影响到平台充电。

另外在修改项目代码准备发布前,想起这个项目用的apacheMQ是2019年安装(当时没有漏洞)在2023年10月份时报出严重漏洞,那时想过修复,跟业务提过,但由于线上不能停机,当时临时处理只配置了防火墙安全策略关了外网访问这些问题端口。开始换MQ后,各服务配置修改重新发布上线,

小结

  有些情况不能按业务说得算。不然迟早要爆雷。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在线遗漏bug率在不同行业和项目中会有所不同,难以简单地给一个业内一般的具体数字。这是因为线上遗漏bug率受到多种因素的影响。 首先,项目规模与复杂度会直接影响线上遗漏bug率。大型复杂项目通常会有更多的代码,更多的功能模块和更多的潜在问题,因此其线上遗漏bug率可能相对较高。 其次,开发团队的技术水平和经验也是一个重要因素。经验丰富的开发团队通常能够更好地识别和解决潜在问题,从而降低线上遗漏bug的概率。 另外,项目的测试与审查过程对于降低线上遗漏bug率也至关重要。严格的测试策略、完善的代码审查流程和有效的Bug跟踪系统都可以帮助发现和解决潜在问题,减少线上遗漏bug的发生。 总的来说,业内对于线上遗漏bug率没有一个具体的标准。每个项目都有其独特性和复杂性,线上遗漏bug率的大小取决于多种因素。因此,提高团队的技术水平,加强测试和代码审查流程,优化Bug跟踪和修复机制等都是降低线上遗漏bug率的有效方法。 ### 回答2: 在线上遗漏bug率在软件行业内是一个常见的问题。由于各种原因,完全消除bug是不太可能的。在实际开发过程中,我们会尽量减少bug的数量并提高软件质量,但无法做到百分之百的无bug。 在线上遗漏bug率的多少因公司、项目、开发团队等不同而异。在业内,一般认为每千行代码遗漏的bug数量为1~5个是比较常见的情况。当然,这只是一个粗略的估计,实际情况可能会有所差异。 影响在线上遗漏bug率的因素很多。首先是项目的复杂程度。复杂的项目通常容易产生更多的bug。其次是开发团队的水平和经验经验丰富的开发人员通常能够更好地避免和解决bug。另外,开发过程中使用的工具、测试流程和质量控制机制也会影响bug率。 为了降低在线上遗漏bug率,我们可以采取一些措施。首先是重视代码质量,编写高质量的代码是减少bug的关键。其次是加强测试环节,包括单元测试、集成测试和系统测试,以尽早发现和解决bug。此外,定期进行代码审查、持续集成和自动化测试也可以提高软件质量并减少bug的数量。 总之,在线上遗漏bug率在软件行业内是一个普遍存在的问题。尽管我们会采取各种措施来降低bug率,但无法完全消除。我们需要努力提高开发质量和测试流程,以确保软件的稳定性和可靠性。 ### 回答3: 线上遗漏bug率在软件开发行业中是一个普遍存在的问题,无法给一个固定的准确数字来表示。其多少直接取决于项目的复杂度、开发团队的技术水平、代码测试与质量保证的程度等因素。 一般来说,在软件开发过程中,开发团队会通过需求分析、设计、编码、测试等多个环节来尽可能减少和排查bug。然而,由于时间和资源的限制,无法完全避免bug现。部分bug可能在开发过程中没有被发现,进而在线上环境中才被用户或者运维人员发现。 对于一些复杂度较高的软件项目,由于涉及的逻辑和功能较多,线上遗漏bug率可能会相对较高。例如,大型互联网平台、金融系统等,其对安全性和稳定性的要求较高,线上遗漏bug率往往会受到更加重视。 为了降低线上遗漏bug率,开发团队通常会采取一系列的措施,如增加代码测试覆盖率、引入自动化测试工具、进行持续集成与部署等。这些措施可以帮助开发团队在开发过程中及时发现和修复bug,减少线上遗漏bug的可能性。 总之,线上遗漏bug率的具体多少无法简单确定,它取决于各种因素的综合影响。但在软件开发行业中,开发团队通常会努力采取措施,尽可能减少线上遗漏bug的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qyhua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值