[转帖]线上一个隐匿 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: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...
随机推荐
- Programming Abstractions in C阅读笔记:p202-p234
<Programming Abstractions in C>学习第65天,p202-p234总结. 一.技术总结 完成第五章学习,第五章介绍递归在实际问题中的进一步应用,例如汉诺塔问题, ...
- 3、Container容器组件
Container容器组件 代码 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( hom ...
- hiveSQL常见专题
SQL强化 SQL执行顺序 --举例: select a.sex, b.city, count(1) as cnt, sum(salary) as sum1 from table1 a join ta ...
- Llama2-Chinese项目:5-推理加速
随着大模型参数规模的不断增长,在有限的算力资源下,提升模型的推理速度逐渐变为一个重要的研究方向.常用的推理加速框架包含lmdeploy.FasterTransformer和vLLM等. 一.lmd ...
- 6种方法帮你搞定SimpleDateFormat类不是线程安全的问题
摘要:本文主要讲述在高并发下SimpleDateFormat类为何会出现安全问题,以及如何解决SimpleDateFormat类的安全问题. 本文分享自华为云社区<[高并发]SimpleDate ...
- 查询速度最高提升50倍!火山引擎ByteHouse在广告投放领域实践分享
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 据QuestMobile报告显示,移动互联网已经进入了下半场,在使用人数和使用时长方面已经没有明显增长,互联 ...
- Linux day3:⽹络不通排查流程 linux重要数据文件 系统优化相关 上传下载 文件权限 所属用户及用户组
目录 ⽹络不通排查流程 linux重要数据文件 etc⽬录下重要的数据⽂件 usr⽬录下重要的数据⽂件 var⽬录下重要的数据⽂件 proc⽬录重要的数据⽂件 系统优化相关 环境变量 下载软件优化操作 ...
- AliPLC 智能丢包补偿算法,提升弱网环境的通话质量
在线视频/语音通话逐渐成为人们日常生活的一部分,而复杂多变的网络环境会导致部分音频包无法传送到接收端,造成语音信号的短时中断或者卡顿,这会严重影响通话体验,为解决这类问题,阿里云视频云音频技术团队在综 ...
- UVA - 10391:Compound Words (字符串水题)
题目大意 给定若干单词,按字典序输出由两个单词拼接而成的单词 思路分析 用set存储所有单词,枚举每个单词word,遍历word的所有左右子串组合情况,若左右子串均在set中,说明符合题意.时间复杂度 ...
- 七、手动制作docker镜像
系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...