遇到这样一个问题:
前端传qua参数给后台, 后台将此参数上报到罗盘, 例如: 前端给的数据是qua=xxx, 那么, 后台需要把对应的key(qua)和value(xxx)上报到罗盘。 但出问题了, 且看PK过程:
(备注:上述下行包可以不考虑)
第一轮PK:
罗盘同学: 罗盘qua数据总量与预期严重不一致, 有一半的qua为空
后台(me): 我已经把前端传过来的qua上报到了罗盘, 前端传的qua有缺失
前端同学: 我已经上报了所有分支的qua给后台, 没有问题
第二轮PK:
后台(me):后台流水数据显示, 有很多qua为空, 接近一半, 与罗盘同学反馈几乎一致
前端同学:我已经上报了qua给后台, 并且经过自测
后台(me):拿起手机自测验证, 发现前端确实上报了qua, 但流水信息显示有很多qua没有上报, 于是怀疑qua为空的问题在某些场景下才会重现
第三轮PK:
后台(me) : 抓包, 过滤qua为空的请求, 发现qua为空的请求非常少, 几乎可以忽略
后台(me): 纳闷, 为什么抓包显示qua为空很少, 但在后台流失中却有近乎一半的qua为空呢? 后台流水的可靠性可是很高的啊。 但是前端同学可不认可这个东西, 看来必须用网络包来说话了。
后台(me): 又想了一下, 难道是前端传了qua, 但后台不小心把qua转成了空? 不可能啊!!!
后台(me): 调整思路:在4台流水机器上实时监控流水, 同时在5台外网cgi机器上实时抓包, 发现流水中qua为空时, 立即停止抓包(不进行过滤)。 终于抓到,oh, my god, 原来, 很多时候(近乎一半), 前端根本就没有携带qua字段, 后台直接取了map["qua"], 此时得到的qua就肯定是空的了。 一切现象都可以解释了。 (其实:既然是近乎一半, 那么抓包应该是很好看出很多时候是没有携带qua的)
根本原因: 在很多场景下(某些手机类型), 前端根本就没有携带qua这个字段(这和携带了qua但qua为空不是同一个概念)。
解决方案: 前端同学改。
花了大半天时间, 想起来, 都是泪。 思路最重要, 吃一堑长一智, map的下标操作务必小心小心再小心。