论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
大数据
›
数据仓库与分析
›
数据漂移问题及解决方案
数据漂移问题及解决方案
张春
金牌会员
|
2023-3-7 01:27:37
|
显示全部楼层
|
阅读模式
楼主
主题
691
|
帖子
691
|
积分
2073
什么是数据漂移?
数据漂移是 ODS 数据的一个顽疾,通常指 ODS 表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据或者丢失当天的变更数据。
实际场景
公司主营互联网金融业务,因此有了一张数据量庞大的申请人信息记录表。这张表里的时间字段非常多,因为整个业务场景涉及到好几段流程:
客户提交申请贷款请求 → 我们接受申请贷款请求 → 进入决策引擎 → 决策引擎调用第三方数据系统 →决策引擎返回结果报告 → 匹配发送记录和返回报告 → 反馈给客户发送结果
可见每一段子流程(子域)里都会有相应的时间字段。 选择使用客户的提交申请时间来做分区字段,也是为了贴近客户的实际体验。即某一天的申请记录明细就应该是那一天客户提交给我们的所有申请信息。实际上并给如此,主要有两种场景导致了异样的发生:
1、通道延迟
我们接受到客户的申请贷款的请求后,到提交给核心信贷系统以及决策引擎系统这段时间理论上是很快的,秒级响应。但某些时候因为
网络波动或者服务器故障,会导致申请积压
,卡在某一环节,如果正好卡在落库之前,这时客户在 T 天提交贷款申请请求,积压解决后申请记录落库实际发生在 T+1 天。导致 T+1 天凌晨做ETL 数据同步时这批申请信息记录获取不到,最终数据平台丢失了一部分数据。
2、特殊业务场景
有一类特殊的业务场景叫”先提后审“,客户提交一种特殊的申请贷款请求后,需要客服审核内容,审批通过后才可实际发送。如果客户在客服下班时间段提交了这种申请贷款请求,那么实际要到第二天客服上班后才会实际被提交,落库也发生在客服审批之后。同上一种情况,也会发生丢失数据的情况。
解决方案
1、延迟重传
某些公司采用了很粗暴的解决方案,T+1 天允许 T 这天的数据存在数据漂移的现象。但是在 T+7 天,对 T天数据进行重传,恢复这些丢失数据,保证最终状态的数据是完整的。这种方式跟公司业务也是跟契合的,因为申请贷款的状态会在 7 天内做更新(因为决策引擎系统返回的状态报告也会有几天的延迟,约定 7 天内不返回报告计为未知状态不再更新)。这种方式本意是用作数据更新的,结果顺带
缓解
了数据漂移。(
不算解决是因为 T+1 天到 T+7 天,数据仍然有丢失,不完美
)
2、更合理的时间切分字段
既然按照申请贷款时间戳切分,会出现数据漂移,那么就考虑换一个业务场景的时间戳。在申请贷款这个业务场景下,选择
放款时间
作为时间切分字段。放款一旦发生,就不会变化;放款作为核心关键功能,除非巨大故障也极少发生延迟现象。(当然真的发生了后期再补数据,因不可抗拒因素产生的问题是无解的,只要做到可补救即可)。如果系统有一个统一的放款服务,这个字段的一致性也是有保证的。
但公司没有采用这种切分方式,我的理解是有两个原因:
1)存在月结客户,并不是所有客户的业务都是先申请再放款的,一些特殊业务大客户是先放款再申请的。
针对这些客户,并不存在真正的放款操作。
2)目前放款服务是散落在系统的各个地方的,并没有统一管理起来,导致放款这个操作本就不具备业务逻辑上的统一性。
针对问题 1),其实是有解的,对月结客户仍然可以走一遍放款流程,记录下一个“伪放款时间”,甚至真放款也无不可,无非额度扣成负数。当然公司目前没有这么操作,针对月结客户,额度是直接锁死的。月结客户的还款计划依赖月度的离线计算脚本。这样的操作同时带来了数据不统一的问题,在线客户的账单来自交易记录(放款,系统操作),而月结客户的账单来自申请记录统计(离线统计,脚本计算)。因为这种数据源的不统一,公司的核心账务计算一直不如意,实在是一个遗憾。
针对问题 2),公司的线上申请贷款业务发展了*年,这么多年里新增了许许多多的业务模块、功能、乃至针对大客户的特权特殊服务。放款操作并不统一,甚至存在一小部分客户是非系统操作,而是由计算脚本放款的。不统一的放款服务也带来了一定的混乱局面,实为另一个遗憾。所幸这个问题以及在推进解决中,公司已经在规划一个放款整体的服务,作为各业务线的中台应用,解决这个历史顽疾。
当然放款时间作为切分字段,针对申请贷款业务来说是很合适的。可惜并不是所有业务场景下都能找得到这样的业务时间。很多公司的情况有很多许多业务功能,使用单一的业务时间会遗漏很多其他过程的变化记录,
比如很常见的电商业务,就有下单、支付、退款、售后等过程,并不适合以某一单一业务时间做切分字段。
3、前后冗余
既然取一天的数据会有数据漂移现象且发生在凌晨,那么自然而然就有一种方式:
我们多向前一天要一部分数据,也向后一天多要一部分数据。根据经验,一般是15 分钟。保证数据只多不少,切分时按照需要的业务时间再过滤
,这样可以解决那些因为延迟造成的数据漂移,
但同时也带来了问题:
如果多获取了 T+1 天的一些更新变化,会导致 T 天的最终状态没有被保留,最终存储在 T 天的数据实际是T+1 天凌晨的状态。这对下游的相关统计会造成一些误差。另外,上边提到的特殊业务场景也并没有解决。
4、多时间字段共同限制
这一部分的感受不是很深刻,按照一些文章的说法:
根据日志时间冗余前后数据,然后用修改时间过滤非当天数据,这一步几乎和之前描述一样,保证系统原因的遗漏不发生;
根据日志时间冗余后一天数据的部分,按照主键以日志时间升序取第一条,为了获取最接近 T 天状态的数据;
将 1,2 步骤的数据做全外连接,限制业务时间来获取 T 天数据。
相对而言,贷款申请业务是一种比较单一、简单的业务场景。而简单的业务场景,解决方案自然也比较简单粗暴。目前**某些公司采用的 T+7 重传,很好地解决了数据更新与数据漂移的问题。虽然我认为统一的放款时间做时间切分会更合理,对财务计算更更友好。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
张春
金牌会员
这个人很懒什么都没写!
楼主热帖
聊聊容灾演练-练什么|深度好文 ...
彻底搞懂Docker容器与Kraft模式kafka集 ...
Redis概述及基本数据结构
【CSDN官方】开源又好用的国产SPL ...
Eclipse连接SQLServer2008
Avalonia项目在OpenKylin运行踩坑 ...
干货|APP自动化Android特殊控件Toast识 ...
PTA 1034 Head of a Gang C++
Docker 部署 Kibana
linux跟踪技术之ebpf
标签云
挺好的
服务器
快速回复
返回顶部
返回列表