IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 实习生跑路留了一个大坑,搞出2个线上问题,我被坑惨了 -> 正文阅读

[大数据]实习生跑路留了一个大坑,搞出2个线上问题,我被坑惨了

小编今天被实习生坑惨了。。。

昨天线上问题

昨天出了一个线上问题,今天又出了一个线上问题。

昨天出的一个线上问题。

a09a06bddfa58dca960065f4410dc74e.png

监控开始报大量的异常pvlost,接口访问过来报500,就报pvlost了。

小编赶快登录到这个出问题的实例,上去手动curl了一下这个请求,发现登录这个实例手动去curl没啥异常信息。

返回是正常的200。连续curl了十几次都没问题。

奇了怪了。

昨天没排查出来就想着加点日志打印点日志看下。这个问题先和客户同步好结论,就准备今天加日志看下。

结果今天还没来得及加日志。。。

今天又出一个线上问题

又爆出来个线上问题,那再继续看下这个新的线上问题。

发现新上线的一个查询故障机房的功能不太好使。

现在线上有两个机房。A机房和B机房。

  • 当A机房的tsdb时序数据库有问题就去查询B机房的tsdb时序数据库。
  • 当B机房的tsdb时序数据库有问题就去查询A机房的tsdb时序数据库。

客户op会发现哪个机房有问题,就会往数据库mysql插入一条故障机房数据。674cf3f1c3bb0fb4018272d4903317b1.png

上图里面的 idcA 对应的时间段有故障。

目前整个架构里面有M服务和D服务查询tsdb时序数据库。

在D服务里面实现了这个查询故障机房的功能,就是查询数据库里面看看那个机房有问题,如果发现用户传的查询起止时间段和mysql数据库里面的idcA故障时间有交集,那么就说明A机房有故障就去读取配置文件中idcB机房的url查询idcB机房的tsdb时序数据。

由于D服务实现了,就用M服务去查询D服务,由于D服务的可承受查询能力不行,M服务的查询压力很大,所以M服务查询D服务的时候做了一层缓存。

这缓存服务代码写的真牛逼,搞出两个线上问题。

    @Cacheable(value =  "cacheManager", key =  "#root.method")
    public String getMalfunctionStatus(long queryStartTime, long queryEndTime) {

        QueryDateDto queryDateDto = new QueryDateDto();
        String startTime = String.valueOf(queryStartTime);
        String endTime = String.valueOf(queryEndTime);

        queryDateDto.setStartTime(startTime);
        queryDateDto.setEndTime(endTime);
        String malfunctionStatus =  "";
        try {
            malfunctionStatus  = 查询D服务的数据http调用。
        } catch (Exception e) {
            LOG.error( "request dashboard failed. e: {}", e.getMessage());
            
        }
         return malfunctionStatus;
    }

缓存分析

getMalfunctionStatus 这个方法加了缓存,key是这个方法名字。假设传的参数queryStartTime:2022-05-17 10:00:00 queryEndTime 2022-05-17 12:00:00

假设这个时间段查询下游 D服务的http调用,返回是故障 状态

缓存时间失效是5分钟。

这5分钟内这个getMalfunctionStatus 这个方法返回的都是故障状态。

如果这5分钟内用户传的是参数queryStartTime:2022-05-17 12:00:00 queryEndTime 2022-05-17 14:00:00 查询时间段不一样,但是由于有缓存,这个返回的还是故障状态。

这缓存加了个寂寞。

加还不如不加。

不加起码能查询下游D服务是正确的返回结果,加了这5分钟内结果都是错的。。。

实习生给小编留大坑!

实习生牛X!

第二个坑

这个服务如果发现当前机房出现故障了。

就根据查询的下游D服务的状态发现故障了,需要切换查询机房的地址。

所以就在配置文件里面写了两个机房的地址,然后读取配置文件就行了。

由于最近用户使用了添加了故障机房,报大量接口返回500错误。

ad05f3a71c08c546117457933e678f37.png

是配置文件这块切换机房的时候的没有端口。导致查询下游服务报500。

总结

之前还是对实习生太仁慈了,以后实习生的代码还是得好好看看,实习生拿着一天300的实习工资,写了一堆坑的代码,搞出两个线上问题,混了份大厂实习经历,拍拍屁股走人了,小编在这擦实习生的屁股。

难受。。。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-04 00:01:46  更:2022-06-04 00:02:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:35:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码