写点什么

【得物技术】交易轨迹系统

用户头像
得物技术
关注
发布于: 2020 年 12 月 30 日
【得物技术】交易轨迹系统

我们不生产数据,我们只是数据的搬运工。

背景

  • 现有系统操作日志都分散在各个域的系统中,而且没有形成规范的系统。导致排查线上问题全是去日志系统各种搜,效率很低。

  • 我们针对系统调用链路有 trace 串联,跨域查问题很爽。但是我们对单据纬度没有 trace 串联,单据流转对于我们来说是黑盒。

  • 开发人员对自己的功能线上情况不清楚,比如:每天卖家发货量多少?不清楚;成功率多少?不清楚;平均响应多少?不清楚;针对当前量,我们是不是需要做一些优化?其实有时候并不是不去关注,只是没有一个很直观的系统去很直观的呈现出来。

  • 为了解决上述问题,交易轨迹系统就应运而生了。

实现思路

怎样去埋数据?

1. 方案一:手动埋点(不推荐)

对现有系统侵入性较高,而且埋点对系统稳定性有一定的影响,不到万不得已不推荐。但是我们提供了这项功能。支持三种接入方式,feign、dubbo 和 rocketmq。

2. 方案二:日志清洗(推荐)

怎样对现有系统不改造,利用现有的资源去寻找事件 action?我们发现 access.log 可以完美的利用起来。但是有一些超时任务和 mq 触发的任务没有 access.log,现阶段需要考虑其他方式接入。后续我们考虑提供公共工具,将 mq 和超时任务触发的动作,写入 access.log 并提供全套的清洗入库套件。

3. 方案三:binlog(不推荐)

为什么不推荐,因为 binlog 拉取不到入参出参,对排查问题没有太大的作用。但是有一点优势很明显,我们可以追踪前后两次的表更。比如:修改地址(A 地址->B 地址)



怎样去数据清洗?

1. 功能独立

和业务系统隔离,独立一套系统去做数据清洗

2. 实时生效

利用 groovy 脚本做清洗逻辑,脚本写好后保存实时生效。

3. 数据扩展

日志里面的数据不满足埋点需求,我们提供了 dubbo 和 feign 的扩展,可以去业务系统查询数据

4. 批量操作支持

批量操作会涉及到多个单号的流转,脚本默认返回 List,对多个单号进行埋点,支持一次解析,多条数据落库

5. 主子单号支持

(同理批量操作)

6. 日志太复杂?解析费劲?

针对日志分析,我们提供的公共的数据获取工具,直接调用方法即可

例子(寄售申请):

package com.shizhuang.duapp.trade.script.biz.deposit.js
import com.alibaba.fastjson.JSONArrayimport com.alibaba.fastjson.JSONObjectimport com.google.common.collect.Listsimport com.shizhuang.duapp.trade.cycle.api.resultdata.BizResultimport com.shizhuang.duapp.trade.cycle.api.script.AccessLogToBizResultBaseScriptimport com.shizhuang.duapp.trade.cycle.api.sourcedata.AccessLogDataimport com.shizhuang.duapp.trade.cycle.api.util.AccessLogUtils
/** * @program: trade-cycle-center * * @author: 小猪佩奇* * @create: 2020-11-20 17:08 * */class ConsignApplyCreate2BizResult extends AccessLogToBizResultBaseScript { List<BizResult> parse(AccessLogData accessLogData) { // 响应结果 String responseData = accessLogData.getResponseData() // 执行时间 String takeTime = accessLogData.getTakeTime() // http 返回code码 String httpStatus = accessLogData.getHttpStatus() // 获取uid String uid = AccessLogUtils.getUid(accessLogData) List<String> applyNoList = this.analyzeApplyItemNo(responseData); List<BizResult> bizResultList = Lists.newArrayList(); for (applyItemNo in applyNoList) { BizResult result = new BizResult() result.setOperatorId(uid) result.setOperationBizNo(applyItemNo) result.setOperationTime(accessLogData.getOperationTime()) result.setOperationSubType("app寄售申请") result.setOperationTrace(accessLogData.getOperationTrace()) result.setOperationCostTime(Long.valueOf(takeTime)) result.setOperationResult("200" == httpStatus ? 0 : 1) //result.setOperationExtend() result.setOperationDetailReq(accessLogData.getPayload()) result.setOperationDetailResp(accessLogData.getResponseData()) bizResultList.add(result); } return bizResultList; }
/** * 分析单号 * @param responseData * @return */ List<String> analyzeApplyItemNo(String responseData) { List<String> list = Lists.newArrayList()
JSONObject jsonObject = JSONObject.parseObject(responseData) JSONObject data = jsonObject.getJSONObject("data") JSONObject applyProduct = data.getJSONObject("applyProduct") if (Objects.isNull(applyProduct)) { return list }
JSONArray applyItems = applyProduct.getJSONArray("applyItems") if (Objects.nonNull(applyItems)) { for (Object applyItem : applyItems) { JSONObject parseObject = JSONObject.parseObject(applyItem.toString()) String applyItemNo = parseObject.getString("applyItemNo"); list.add(applyItemNo); } } return list }}
复制代码

怎样去做数据呈现?

1. 单据纬度


寄存单交易轨迹


客服工单轨迹


查询时段段内,单据的流转轨迹(支持跨域跨系统展示)。根据来源数据和结果数据,排查问题根源。如需查看详细日志,可以根据 traceId 去日志系统去查看详细 trace 日志。

2. 人纬度



统计时间段内用户的操作行为,方便排查某个时间段内用户的操作。

怎样自定义图形化?

TDengine 时序数据库存储的存储的数据都是带有时间戳的,且本身很好地支持时间维度的聚合,正好可以结合 grafana 对操作日志中的数据进行分析,展示各类业务运转的情况。



系统接入

access log 方式接入

  1. 下载脚本项目,编写脚本代码

  2. 新增事件脚本类,将脚本代码配置到交易轨迹系统



  1. 添加路由规则,关联事件和脚本



rocketMq 方式接入

mq 接入方式和 rpc 方式相同,各业务系统把数据封装好,通过硬编码的方式将数据发送到 mq,轨迹系统订阅消息进行数据清洗并持久化。有时候获取事件不是很方便,通过 mq 的方式接入也未尝不是一种好的方式。

扩展

  • 在存储上我们支持跨度一年的轨迹查询,在存储上已经做过优化,接入方可以不考虑存储问题。

  • 在和财务系统、客服系统的对接中。我们发现还有更多的方向去扩展功能,不仅仅是局限于交易轨迹。

  • 财务系统需要记录和第三方交互的请求报文,排查问题的时候直接通过单号快速查询第三方报文。

  • 客服系统需要记录客服会话的生命周期,通过会话 id 可以直观的查看会话链路。并且可以通过客服 id 可以快速统计客服的接入量统计。

  • 后续会加强图形化的功能和简易数据分析的能力

  • 理论上我们只提供了一种存储能力,规范了数据存储的格式。具体怎样使用,使用方可以自定义。

  • 最后打个广告,欢迎大家接入。


文/得物技术 Ambition

发布于: 2020 年 12 月 30 日阅读数: 654
用户头像

得物技术

关注

得物APP技术部 2019.11.13 加入

关注微信公众号「得物技术」

评论

发布
暂无评论
【得物技术】交易轨迹系统