[转帖]线上一个隐匿 Bug 的复盘
前言
之前负责的一个项目上线好久了,最近突然爆出一 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 后的补救措施,在以后的项目中我们能提前做些什么呢?
- 一旦出现等值关联,则需要考虑关联字段的字段类型是否一致;
- 定义表时,需要结合具体业务情况考虑可能出现的最大值的数据范围;
- 不能因为害怕出现此问题,在不加思索的情况下,只要等值关联就使用
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 的复盘的更多相关文章
- 线上一次大量 CLOSE_WAIT 复盘
https://mp.weixin.qq.com/s/PfM3hEsDa3CMLbbKqis-og 线上一次大量 CLOSE_WAIT 复盘 原创 ms2008 poslua 2019-07-05 最 ...
- Redis 集群缓存测试要点--关于 线上 token 失效 BUG 的总结
在测试账户系统过程中遇到了线上大面积用户登录态失效的严重问题,事后对于其原因及测试盲点做了一些总结记录以便以后查阅,总结分为以下7点,其中原理性的解释有些摘自网络. 1.账户系统token失效问题复盘 ...
- 测试通过!为何线上还有很多BUG?实践中的质量控制
质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景 ...
- 测试通过!为何线上还有很多BUG?
质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景 ...
- mysql线上一个定时备份脚本
数据库服务使用的是阿里云的mysql,远程进行定时的全量备份,备份到本地,以防万一.mysql数据库远程备份的数据最好打包压缩: [root@huanqiuPC crontab]# pwd/Data/ ...
- ugui SetParent在安卓上一个诡异bug
问题描述 我的环境:Unity3D 5.3.7 出问题机型:安卓模拟器.部分低配安卓机型(比如:红米2A) 以下代码是设置某个节点的父节点,在PC.Editor.大部分手机上都是正常的,但问题机型上, ...
- 一次线上OOM问题的个人复盘
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 上个月,我们一个java服务上线后,偶尔会发生内存OOM(Out Of Memory)问题,但由于OOM导致服务 ...
- 互联网IT当线上出现 bug 时,是怎么处理的?
线上BUG说处理方法:1.关于线上BUG问题,目前公司有一整套线上故障流程规范,包括故障定义.定级.处理流程.故障处理超时升级机制.故障处理小组.故障处罚(与故障存在时长有关)等:2.最主要的是,线上 ...
- 如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式
如何利用Grunt生成对应的Source Map文件,线上代码压缩使用chrome浏览器便于调式 首先我们来说说为何要生成sourceMap文件呢?简单的说,sourceMap是为了压缩后的代码调式提 ...
- 线上日志集中化可视化管理:ELK
本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...
随机推荐
- Zookeeper 的基本使用
维基百科对 Zookeeper 的介绍如下所示: Apache ZooKeeper是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务.同步服务和命名注册 ZooKe ...
- 全网最全的华为ensp数通设备命令全集
[命令] display history-command [视图]所有视图 [参数]无 [描述] display history-command 命令用来显示当 前用户曾键入的最后 10 条命令.用户 ...
- 分布式机器学习的故事:Docker改变世界
分布式机器学习的故事:Docker改变世界 Docker最近很火.Docker实现了"集装箱"--一种介于"软件包"和"虚拟机"之间的概念- ...
- 如何解决windos系统关闭nginx进程之后仍然可以访问?
1.停止Nginx服务的四种方法 从容停止服务 这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止. nginx -s quit 立即停止服务 这种方法比较强硬,无论进程是否在工作, ...
- 华为云云容器引擎CCE产品文档带来4个升级,降低使用难度
本文分享自华为云社区<华为云云容器引擎CCE产品文档优化升级!>,作者: 云容器大未来 . 云原生产品技术栈庞大,需要用户对容器.Kubernetes等核心技术都有扎实的理解和掌握:同时问 ...
- 云原生势不可挡,华为云GaussDB加速企业数字化转型
4月8日,华为云TechWave全球技术峰会在深圳成功举办,其中,在围绕"数据使能,驱动业务增长"为主题的数据使能分论坛会上,华为云GaussDB技术专家胡彦军现场分享了云原生数据 ...
- 【“互联网+”大赛华为云赛道】GaussDB命题攻略:支持三种开发语言,轻松完成数据库缓冲池
摘要:七届中国国际"互联网+"大学生创新创业大赛火热报名中,为了帮助参赛者更好了解赛题设计思路和命题方向,华为云产业命题赛道举行了线上直播解读,华为云数据库资深架构师苏斌在直播间详 ...
- Scala Http请求工具类
import java.io.IOException import java.util import org.apache.http.client.ClientProtocolException im ...
- 查询速度最高提升50倍!火山引擎ByteHouse在广告投放领域实践分享
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 据QuestMobile报告显示,移动互联网已经进入了下半场,在使用人数和使用时长方面已经没有明显增长,互联 ...
- 【短道速滑四】Halcon的texture_laws算子自我研究
Halcon里有个texture_laws 算子,最近实现了下,记录下相关细节. Halcon的文档里对该算子是这样描述的: texture_laws - Filter an image using ...