java项目线上捉BUG经验记录

这篇具有很好参考价值的文章主要介绍了java项目线上捉BUG经验记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 线上问题

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

二 线上分析

1 查项目运行日记

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

java项目线上捉BUG经验记录,bug

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

2 查服务器流量:

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

java项目线上捉BUG经验记录,bug

java项目线上捉BUG经验记录,bug 

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

3 查项目运行状态:

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

java项目线上捉BUG经验记录,bug

在升高的时候查看栈信息

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后,各服务配置修改重新发布上线,

小结

  有些情况不能按业务说得算。不然迟早要爆雷。文章来源地址https://www.toymoban.com/news/detail-837570.html

到了这里,关于java项目线上捉BUG经验记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次线上BUG排查过程

    1. 线上遇到一个非常奇怪的bug,为一个用户分配业务线类型后,该用户登录时,提示502,但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志,看是否有error,但日志里边这个接口200正常返回 本地debug,也复现一样问题,在分配角色类型超过22个总数时就报

    2024年02月09日
    浏览(41)
  • 【记录处理Vue项目中Video.js播放不了MP4视频Bug】

    在Vue项目中使用Video.js播放MP4视频。 在项目中使用Video.js播放MP4视频。视频采集上来存在数据库,前端使用Video.js对视频进行播放。突然有一天,MP4视频播放不了,并且报错: VIDEOJS: ERROR: (CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) No compatible source was found for this media. 并发现前一时间段采集到

    2024年04月14日
    浏览(36)
  • 【记录Bug】IDEA提示“Error:java: 错误: 不支持发行版本 17”

    开发工具:IDea 后端框架:SpringBoot 在rebuild或运行项目时提示“Error:java: 错误: 不支持发行版本 17”。 这个错误表明你的IDEA版本不支持使用Java 17。你需要将项目编译运行环境设置为更低版本的Java,或者升级你的IDEA版本以支持Java 17。 构建项目时选择了高版本的Java,而IDea的版

    2024年02月08日
    浏览(42)
  • Java中代码Bug记录--泛型失效、数组删除、HashMap死循环

    最近在工作的过程中,遇到了不少奇怪自己或者同事的Bug,都是一些出乎意料的,不太容易发现的,记录一下来帮助可能也遇到了这些Bug的人 上面的代码,我们很容易看出来,无法通过编译,因为Map的value需要的是一个String,但我们传的是一个int。但我只要稍微改一下: 同样

    2024年02月16日
    浏览(34)
  • 【经验与Bug】tensorflow草记

    conda activate tf 在anaconda prompt使用,进入名为tf的虚拟环境。 pip install 包名== 可以查看指定包能被找到的所有版本。 pip install 包名 -i https://pypi.org/simple 从官方源下载包。 绘制多图 : Colab挂载谷歌云端硬盘 。 python连接列表 。 同样的,元组也可以使用 “+” 进行连接运算。

    2023年04月23日
    浏览(28)
  • 项目bug——编码问题报错(java.lang.IllegalStateException)

    项目拉下后报错 2023-07-17 14:26:07.596 ERROR 14300 — [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalStateException: Failed to load property source from ‘file:/Users/wang/IdeaProjects/ms-family-pre/target/classes/application.yaml’ (classpath:/application.yaml) at org.springframework.boot.context.config.ConfigFileAppl

    2024年02月16日
    浏览(43)
  • 一个线上全文索引BUG的排查:关于类阿拉件数字的分词与检索

    说到全文检索的分词,多半讲到的是中(日韩)文分词,少有英文等拉丁文系语言,因为英语单词天然就是分词的。 但更少讲到阿拉伯数字。比如金额,手机号码,座机号码等等。 以下不是传统的从0开始针对mysql全文索引前世今生讲起。 我更喜欢从一个小问题入手,见缝插针

    2024年02月05日
    浏览(55)
  • 【网安】处理项目中的一些常见漏洞bug(java相关)

    [福利:[ 网络安全重磅福利:入门进阶全套282G学习资源包免费分享 !]](网络安全重磅福利:入门进阶全套282G学习资源包免费分享! ) 1.写在前面 很多时候,一些项目,或许都会有一定的系统安全要求。一般常见于政府项目比较多!!! 项目做完后,都需要做一些安全的扫

    2024年02月13日
    浏览(28)
  • 记一次线上bug排查-----SpringCloud Gateway组件 请求头accept-encoding导致响应结果乱码

           基于公司的业务需求,在SpringCloud Gateway组件的基础上,写了一个转发服务,测试开发阶段运行正常,并实现初步使用。但三个月后,PostMan请求接口,返回异常,经排查,从日志中获取到转发响应的结果为乱码:        跟踪日志: 转发到目标接口,响应结果已乱码

    2024年02月04日
    浏览(42)
  • golang 锁bug 记录

    例如 会先获取了读锁,协程里面有个写锁,如果整体还嵌套了读锁,直接出现死锁了 ,卡在all_lock_test.RLock() ,读锁永远也不能释放了

    2024年04月29日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包