如何实现日常业务问题的一键排查?
背景
而开发同学解决这些问题也相当痛苦:反复沟通获取必要的查询参数,从多个平台得到业务数据,如果没有相关的平台工具,那么还会通过构建SQL, rpc服务入参,缓存key等查询获取所需要的业务参数,最后根据你多年对业务的理解,从这些数据中找到答案。
我们可以将以上归纳为两个影响我们日常问题排查效率的因素:问题流转多;排查链路长。
一键获取所有关联业务数据:输入不同维度的入参,获取一致的数据结果;
业务数据易于理解,人人可用:可对业务数据属性进行解释,以方便非技术人员自助查询;
业务数据可诊断:如果数据出现异常,能够给出异常的数据信息。
业务数据全景与诊断
整体思路
异常case问题:业务数据存在异常(数据缺失,状态不一致等)
业务数据查询:数据正常,需要咨询相关数据(单据状态,权益核销情况等)
数据全景
关于GraphQL的介绍:https://graphql.cn/
闲鱼此前有过关于GraphQL的一些实践。通过编写graphql语句一次性获取所有的数据,前端根据数据直接渲染,实现快速搭建页面。通过将业务逻辑前置,服务端只需要专注于建设稳定的域服务,使我们开发过程中免除了前后端的数据格式约定和接口联调,提高了研发效率。很多情况下,GraphQL也可以作为FaaS的一种解决方案。
我们以闲鱼回收业务为例,该业务全链路涉及到 交易,资金,芝麻信用,蚂蚁能量,佣金结算,和估价数据,其graphql语句简单描述为:
数据重分组
输入数据的不确定性
异构数据统一
状态值转换:通常用于翻译可枚举的状态值,如交易状态=6 解释为 交易状态=6(交易成功);
虚拟属性值对:类似于宏,如定义 "是否是高价订单" = eval(order.price>2000), 计算表达式的值,以补充一个原本不存在的属性字段。
现在,我们已经得到一个可以查询业务全景数据的工具了。你可以使用它作为业务数据的查询控制台。
业务诊断
if(实际值!=期望值){
print 异常结果
}
当 数据中出现A数据时,数据还应当有结果[B1,B2,B3]。
这些规则可以从业务TC用例得出,进行可视化后还能帮助新人学习业务逻辑。
QLExpress(https://github.com/taobao/qlexpress)是阿里开源的一种动态脚本引擎,功能强大,兼容java的大部分语法,可以使用关键字别名替换:
如果(order.isCreditOrder == "1")
则 return order.idleCreditPayAmount > 0;
否则 return true;
//defaultContext 是数据转换后的数据,作为qlexpress的上下文
Object executeResult = QLExpressUtil.execute(ruleExpress, defaultContext,
errorList, false, false);
//将执行结果转换,空结果默认成功, 如果结果为失败,则再执行一次formater获得错误文案
QLExpResult qlExpResult = buildQlExpResult(context, executeResult, formater);
if (!qlExpResult.getSuccess()) {
errors.add(DiagnosisError
.of(ErrorLevel.BIZ_ERROR.name(), ruleName, String.valueOf(qlExpResult.getData())));
}
能力延伸
用例的自动化检查
使用GraphQL 实现业务数据的聚合查询;
使用JSONPath 解决不同维度的异构数据和业务数据的重分组,并进行业务语义解释;
使用QLExpress 表达和执行业务数据规则,完成数据的诊断。
结合日志检索工具,用户行为回放工具提供更多维度的一键直达;
对异常数据的处理,包括数据订正,审批,指引;
为客服,答疑等场景提供排查手段,引入敏感数据分级,防止数据泄露;
接入业务消息进行对账&监控预警。
评论