前言

之前负责的一个项目上线好久了,最近突然爆出一 Bug,最后评估影响范围将 Bug 升级成了故障,只因为影响的数据量有 10000 条左右,对业务方造成了一定的影响。

但因为不涉及到资金损失,Bug 修复后对数据进行修补,所以最终级别也是较低的。

今天和大家分享这个线上隐匿的 Bug,也好在工作的项目中得以借鉴哈~

需求背景

主题:民宿入住回访问卷

描述:

针对入住民宿的顾客,在离店后的当天或第二天内需要给顾客发送本次入住民宿的回访问卷,以此收集顾客入住体验的意见或建议

说明:

因为数据量较大,采用的是 Hive 库存储数据和逻辑加工

问题分析

1.业务逻辑

**t2表:**存储(昨日+今日此时)离店的顾客清单信息

**t3表:**存储已发送过回访问卷的顾客清单信息

出现 Bug 的核心业务逻辑如下:

所使用的等值关联字段为:

t2.id = t3.primary_id

t2表中过滤掉t3表中的数据,通过使用t2表作为主表left join子表t3表

然后判断t3.primary_id is null,说明是没有发送过的。

2.问题出现

t2.id字段类型为:string 类型

t3.primary_id字段类型为:bigint 类型

两个不同类型的字段进行等值关联时,当t3.primary_id实际值为超过 16 位的数值时则在 MapReduce 计算过程中将其字段类型由 bigint 类型转换为 double 类型,此时就出现了精度缺失的情况。

例如:

# 此处只是用来举例说明问题,不代表实际真实值
t2.id = 1000110000000000
t3.primary_id = 10001100000000009
  • 1
  • 2
  • 3

如上例子,t3表中已有 primary_id = 10001100000000009的记录发送过回访问卷

此时t3.primary_id = 10001100000000009的值超过 16 位,将其转换成 double 类型时,将其值进行截断后再等值关联

则会出现将t3.primary_id = 1000110000000000(将末尾的9去掉)再与t2表中的id关联

正好关联上已有 primary_id = 10001100000000009的记录,所以认为此条记录不应该再发送回访问卷,直接被过滤掉了

而实际业务中这条记录并不在已发送回访问卷记录表中,只因为精度缺失导致不该关联上的两条记录再被截断后错误的关联上了

结果:导致应该发送回访问卷的顾客,没有被发送

解决方案

1.Bug 解决

当时线上出现这个 Bug 后第一时间的解决方案是:
将等值关联的字段进行类型转换,全部转换成 string 类型后再进行等值关联

使用cast函数进行类型转换,这样可以解决精度缺失的问题

2.漏掉数据处理

将等值关联处修改后的代码逻辑,按照影响的业务数据时间范围,重新执行一次,找出本应该发送回访问卷但因此 Bug 而未发送的顾客清单,发送一次回访问卷。

总结

通过前面的分析,可看出这个线上的 Bug 比较隐匿,如果对隐式转换规则不清楚,则很大可能会出现这方面的问题。

今天给大家分享这个隐式转换的 Bug,希望在今后的工作项目中有类似问题时可借鉴一二。

除了出现 Bug 后的补救措施,在以后的项目中我们能提前做些什么呢?

  1. 一旦出现等值关联,则需要考虑关联字段的字段类型是否一致;
  2. 定义表时,需要结合具体业务情况考虑可能出现的最大值的数据范围;
  3. 不能因为害怕出现此问题,在不加思索的情况下,只要等值关联就使用cast函数进行 string 类型的转换;

欢迎关注 无量测试之道 公众号,回复领取资源

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

Vue前端组件化框架开发、

资源和代码 免费送啦~

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:无量测试之道

添加关注,让我们一起共同成长!

</article>

[转帖]线上一个隐匿 Bug 的复盘的更多相关文章

  1. 线上一次大量 CLOSE_WAIT 复盘

    https://mp.weixin.qq.com/s/PfM3hEsDa3CMLbbKqis-og 线上一次大量 CLOSE_WAIT 复盘 原创 ms2008 poslua 2019-07-05 最 ...

  2. Redis 集群缓存测试要点--关于 线上 token 失效 BUG 的总结

    在测试账户系统过程中遇到了线上大面积用户登录态失效的严重问题,事后对于其原因及测试盲点做了一些总结记录以便以后查阅,总结分为以下7点,其中原理性的解释有些摘自网络. 1.账户系统token失效问题复盘 ...

  3. 测试通过!为何线上还有很多BUG?实践中的质量控制

    质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景 ...

  4. 测试通过!为何线上还有很多BUG?

    质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景 ...

  5. mysql线上一个定时备份脚本

    数据库服务使用的是阿里云的mysql,远程进行定时的全量备份,备份到本地,以防万一.mysql数据库远程备份的数据最好打包压缩: [root@huanqiuPC crontab]# pwd/Data/ ...

  6. ugui SetParent在安卓上一个诡异bug

    问题描述 我的环境:Unity3D 5.3.7 出问题机型:安卓模拟器.部分低配安卓机型(比如:红米2A) 以下代码是设置某个节点的父节点,在PC.Editor.大部分手机上都是正常的,但问题机型上, ...

  7. 一次线上OOM问题的个人复盘

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 上个月,我们一个java服务上线后,偶尔会发生内存OOM(Out Of Memory)问题,但由于OOM导致服务 ...

  8. 互联网IT当线上出现 bug 时,是怎么处理的?

    线上BUG说处理方法:1.关于线上BUG问题,目前公司有一整套线上故障流程规范,包括故障定义.定级.处理流程.故障处理超时升级机制.故障处理小组.故障处罚(与故障存在时长有关)等:2.最主要的是,线上 ...

  9. 如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式

    如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式 首先我们来说说为何要生成sourceMap文件呢?简单的说,sourceMap是为了压缩后的代码调式提 ...

  10. 线上日志集中化可视化管理:ELK

    本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...

随机推荐

  1. 神经网络优化篇:详解Mini-batch 梯度下降(Mini-batch gradient descent)

    Mini-batch 梯度下降 机器学习的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,需要训练诸多模型,才能找到合适的那一个,所以,优化算法能够帮助快速训练模型. 其中一个难点在于,深度学习没 ...

  2. k8s卷管理-1

    目录 卷管理-1 1. 本地存储 1.1 emptyDir 1.2 hostPath 网络存储 搭建NFS服务器 使用NFS网络存储 搭建iSCSI服务器 使用iSCSI网络存储 卷管理-1 我们之前 ...

  3. 2023“强网杯”部分WP

    强网先锋 SpeedUp 题目 我的解答: 分析代码可知是求2的27次方的阶乘的每一位的和. 使用在线网址直接查看:https://oeis.org/A244060/list 然后sha256加密 f ...

  4. FlinkSQL实战开发

    FlinkSQL实战开发 1.基础知识 FlinkSQL分为Table API和SQL API,是架构于Flink Core之上用SQL予以方便快捷地进行结构化数据处理的上层库. 工作流程 SQL和T ...

  5. mac 编译php 7.2+扩展编译 的坑史(不是swoole的坑),php的一个坑,这个坑还没填满,问题根源还没有找到 !

    目前网上找到的文章全是php 7.1,但是brew己经没有7.1了,最新是7.2,这让我怀疑是不是我的版本问题,导致swoole编译时总是编译不过去.后来发现任何扩展都编不过去,提示: Configu ...

  6. Spring Cloud Eureka 服务注册中心怎么配置

    「Spring Cloud Eureka 入门系列」 Spring Cloud Eureka 入门 (一)服务注册中心详解 Spring Cloud Eureka 入门 (二)服务提供者详解 Spri ...

  7. 软件界旷世之架:测试驱动开发(TDD)之争

    摘要:在软件行业中,神仙打架的名场面,那就不得不提的是2014年的那场--测试驱动开发(TDD)之争. 在历史上有很多精彩绝伦的神仙打架,比如数学界的牛顿和莱布尼茨关于微积分的旷世之争:比如量子物理中 ...

  8. AI新手语音入门:认识词错率WER与字错率CER

    摘要:本文介绍了词错率WER和字错率CER的概念,引入了编辑距离的概念与计算方法,从而推导得到词错率或字错率的计算方法. 本文分享自华为云社区<新手语音入门(一):认识词错率WER与字错率CER ...

  9. 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0 (Ⅴ)

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...

  10. Codeforces Round #739 (Div. 3) 个人题解(A~F2)

    比赛链接:Here 1560A. Dislike of Threes Description 找出第 $k$ 大的不可被 $3$ 整除以及非 $3$ 结尾的整数 直接枚举出前 1000 个符合条件的数 ...