本文整顿自网易互娱资深工程师, Flink Contributor, CDC Contributor 林佳,在 FFA 实时风控专场的分享。本篇内容次要分为五个局部:
- 实时风控业务会话
- 会话关联的 Flink 实现
- HTAP 风控平台建设
- 晋升风控后果数据能效
- 倒退历程与展望未来
家喻户晓,网易互娱的外围业务之一是线上互动娱乐应用服务,比方大家耳熟能详的梦幻西游、阴阳师等都是网易互娱的产品。不论是游戏产品还是其余利用,都须要做出好的内容来吸引用户进行利用内购买,进而产生盈利。
当用户在商城里点击商品进行购买的时候,会弹出领取界面,进行验证、领取后,就能够收到道具了。这个过程对于用户来说往往都是一些非常简单的操作,但为了保障这个过程能够正确结算、发货,整个领取流程其实逾越了很多服务提供商和终端,走了一条相当简单的调用链路。这些不同的业务节点之间会产生很多互相的调用关系,进而产生一些异构的日志、数据、记录。
因为通过了网络,其中的数据可能会有肯定工夫水位线的不统一、提早,甚至数据失落的状况,且自身这些数据又很可能是异构的,就更增大了咱们对这些数据进行剖析和应用的难度。
如果咱们须要用这些数据进行高时效性的故障排查或者危险管制,就势必须要研制一套计划,来适配这样技术需要。为了解决以上的问题,咱们以 Flink 为计算引擎构建了一套实时风控平台,并为他起名为 Luna,上面我将为大家进行具体的介绍。
实时风控业务会话
常见的线上领取逻辑是,当用户在利用上点击商城的道具进行利用内购买的时候,用户的客户端终端就会到计费零碎进行下单,取得本次下单的订单信息。
而后咱们的客户端会弹出领取界面,用户进行渠道付款。
当领取实现后,咱们会把渠道返回给客户端的领取凭证回传给计费零碎,计费零碎会去渠道验证凭证是否无效。
如果是无效的,就会告诉游戏服务器发货,这个时候咱们的客户端才会收到道具。这就是从用户点击到最终收到道具的整个流程。
从这个曾经极度简化了的领取模型能够看到,不同的公司、服务提供商、部门、服务零碎会产生了一系列会话下的数据。如果咱们能把这些数据收集起来,进行肯定的解决后,还原过后用户操作的现场。这将对经营运维人员在定位故障、排查故障,甚至整个业务环境的宏观剖析都有着十分重要的价值。
而剖析的关键点是,咱们如何还原这个行为的现场,咱们把这个行为的现场叫风控业务会话,即由一次用户行为所引发的,须要多个零碎合作实现、同时触发多个申请、产生逾越多个服务提供方调用的全过程。
这里须要留神的是,业务会话逾越了多个互相独立的申请链路,且没有对立全局的 trace-id 能够被提前置入所有的数据中。
因为咱们的业务会话须要逾越多个申请链路,所以在数据关联剖析的时候就存在很多难题。比方
- 多服务、多申请产生的异构后果难以间接关联。
- 调用程序简单,存在并发、异步的状况。
- 时间跨度大、业务水位不同步。
以前在解决领取丢单、领取一次反复发货等问题的时候,往往只能通过经营人员去解决,这就十分依赖于运维人员的教训了。并且在这些大量的数据里,会有十分多冗余和无用字段,还有可能会有一些非常复杂的嵌套关系。这些都有可能让运维人员在判断时产生错判和误判。此外,还会给运维人员带来十分多的重复性工作,从而使得人力能效低下,把工夫节约在反复的事件上。
前文也提到了开源 Tracing 计划,往往须要依赖全局的 trace-id。对于新的零碎,咱们能够提前设计 trace-id 打点。然而对于有历史包袱的零碎来说,他们往往不违心批改跟踪来跟踪打点,那么这个时候传统的计划就走不通了。
在这种状况下,如果咱们要进行业务会话还原,就须要设计一套新的计划。这套计划咱们心愿能够具备以下性能:
- 实时宏观业务会话检索与查错。
- 实时宏观业务环境统计与风控。
- 业务会话级数据能效开掘与晋升。
从还原业务会话到应用数据做 HTAP 实时风控平台的全过程,咱们应用 Flink 生产原始数据,依据平台上提前配置好的剖析模板,实时还原出业务会话。而后把业务会话的后果存储存起来,并为它打上咱们提前设置好的一些论断模型,产生的风控论断。
对于存储起来的这些宏观会话进一步被聚合,进而产生整个业务环境上的宏观统计量,以反对咱们在整个平台上的风控剖析需要。
会话关联的 Flink 实现
Flink 是实时计算的施行规范,基于此咱们毫无疑问地抉择了它。
那么实时业务会话关联在 Flink 零碎上,咱们心愿能够做出怎么的成果呢?
- 第一,零侵入。即无需对现有业务进行改变,也无需有全局的跟踪 ID,就能够做到业务会话的还原。
- 第二,跨数据源。因为咱们的业务往往须要逾越 n 种数据源,所以咱们心愿这 n 种数据源都能够被这个零碎所反对,比方日志、维表、事实表、REST 接口等。
- 第三,实时。实时产生后果,无需期待 T+1。
- 第四,低代码。咱们心愿基于剖析需要,能够通过向导式的配置,来产生实时的剖析模板,并对宏观统计报表,能够配置式的进行多维度聚合。
上图展现的是 JFlink-SDK,它是网易自研的一套流治理平台以及它的开发手脚架 SDK。大家能够把它了解成是一套能够模块化配置式开发的流作业手脚架,实时关联剖析的引擎就是基于这套手脚架开发进去的。
回到在应用业务会话还原的问题上。来自各个数据源的数据业务点,通过各种形式被同步收集到数据仓库的存储层中,咱们有多种数据存储收集这些数据。针对各种各样的数据存储,Flink 有十分丰盛的 connect 能够进行生产。而后 JFlink-SDK 又对它进行了二次封装,定义异构数据。使其在读取到 Flink 的时候,能够被转化成对立的视图。
这些数据视图是咱们提前建设好的一些数据治理零碎和平台,数据治理零碎会为 JFlink-SDK 提供数据读取的标准。
当通过 SDK Source 读取后,他们就会被对立转化成业务视图,这样就十分不便咱们后续对这些原始异构的数据进行关联了。
它的数据结构是以基准和非基准独特形成的一种设计。在进行业务数据点关联的时候,它的根本思维是基准 + 补充。所以咱们在抉择业务时,会抉择最为外围的风控阶段作为基准,也就意味着,基准是整个业务中最要害的步骤,能够用惟一的 ID 关联起来。
对于通过业务 ID 关联起来的基准,咱们会造成一个相似图的数据结构,这个货色咱们称之为基准簇,它由同一种数据起源的基准和补充所关联失去的一个雪花状数据结构。
基准是业务会话中最要害的步骤,它通常是公共携带的某种标记步骤。比方以计费下单为场景,客户端的下单,关上领取界面、上传凭证、领取实现是四个最为要害的步骤。他们都打上了执行这些步骤的订单号,这四个步骤就能够作为整个业务布局的外围步骤,也就是基准。因为数据是不按程序达到的,所以呈现这是个步骤中的任意一个咱们都能够开启业务会话。
而下单记录、商品详情、渠道回调记录等等一些辅助性的数据,他们对问题定位起不了关键作用,而且它们可能没有基准中订单号的字段,所以就没有资格被选为基准。
但它们中也有一些字段能够和基准中的字段进行关联。比方渠道回调日志,渠道商在一些辅助性的数据上打了 trans_id 字段。它尽管没有 order_id,但它能够通过 trans_id 与基准中的 trans_id 建设一一映射的关系,也就是咱们能够通过 trans_id 关联起这份数据与基准簇的关系。
所以通过基准 + 补充,咱们就能够解决目前线上零碎,无奈为所有数据打上对立 ID 埋点的痛点。
在 Stream API 中基准关联的实现,咱们应用的是 Session Window。它是 Flink 提供给咱们的规范工夫窗口之一,能够在有数据流入的时候进行窗口工夫超时的重置。除此之外,如果整条流的业务水位线,越过了整个超时工夫的边界,它就会触发窗口计算。这种后果就非常适合由用户触发的会话窗口,也适宜咱们基准数据结构的逻辑。
但用户引起的这种行为,往往工夫是不固定的,所以带有属性的会话窗口就十分适配这种个性。比方风控业务会话的还原,和浏览商品到最终下单领取的整个领取利用轨迹的追踪,都非常适合用这种模式来进行窗口计算。
这里的 Flink Session Window 其实就是前文提到的结构结束的基准簇,它蕴含了所有被关联进来的原始数据,以及依照肯定规定解决好的二级字段。至于它怎么在关联的时候进行字段抽取呢,后续再来探讨这个规定,此处就先认为,在窗口实现的时候就把簇计算出来了,并实现了所需字段计算和抽取。
个别用户的领取志愿窗口往往在 10~20 分钟,如果咱们间接应用 Event Time Session Window 来进行计算,就会发现如果用户很快实现了下单,但零碎依然须要期待 10~20 分钟,能力使会话窗口进行计算,这就大大降低了数据的时效性。
对此 Flink 也为咱们提供了一口入口,咱们能够自定义窗口的 Trigger 来设置窗口触发的机会和业务会话提前结束的断定。
举个例子,一些数据量极少的场景,它的水位线可能始终没有向前推动,这种状况咱们就能够加上 Process Timeout 和 FIRE & UPDATE 语义。这就能够让业务会话在水位线没有推动的状况下,先进行计算,往后发送。而后在上游进行保障,即当上游反复 fire 的时候,能够进行 update 的语义。
再举个例子,咱们能够在风控的剖析模板中配置一下。当业务会话满足某些条件的时候,就不必再期待超时了。比方当所有的节点都被关联上时,如果持续期待也不会等到任何节点,这个时候就无需期待超时工夫,能够立刻 fire 出后果。
当业务会话存在一些非凡且极其的状况,比方客户端领取到一半解体了,等了十分久才起来,这个时候很可能就会被拆分为两个业务会话,因为前一个业务会话曾经超时了。这种时候咱们会抉择把两个被决裂的会话 fire 进去,而后由运维人员进行合并或者放弃原样。
接下来咱们来讨论一下,对于补充的数据咱们又是如何结构的。基准数据领有公共 ID,所以它们能够被 Key By 到数据窗口里进行计算。然而补充数据点往往是各自用各自不同的 ID 进行关联,所以这个时候咱们就能够类比数据库里的多表 join 了。不同的补充数据就相似于一张不同的表,通过不同的字段与基准数据簇进行 join 操作。
这就是咱们遇到的挑战,它不仅关联字段不同,水位线的推动速度也很可能不一样,这都是无奈把它们两者放到同工夫窗口中计算的关键因素。
那么如何去解决这个问题呢?如何基于扩大的基准先进常识,关联回没有公共 ID 的补充数据呢?这正是整个解决没有公共 trans_id 还能造成会话的关键所在。
类比 join 操作,Flink 曾经为咱们提供了十分好用的算子,叫做 Interval Join。即两种输出数据别离取本人的特定字段作为 key,而后通过这个 key 把他们分到同一分组上,进行工夫区间内的 join。
Flink Event Time Interval Join 是把以后流和对手输出流里,指定高低边界的区间内数据进行 join,这种个性就十分实用于咱们这种场景,因为当咱们从基准数据簇中取一个字段,和从非基准的补充中取一个字段,如果它们等值,那就意味着它们属于同业务会话,它们应该进行关联。
这个时候就能够用 Interval Join 算子进行关联,而且 Interval Join 不会关上工夫窗口,因为每条流的 GC Watermark 是依据对手流加上咱们提前配置的边界工夫区间来进行的,这种构造就非常适合两种数据流工夫水位线推动不统一的状况。
然而还有另外一种状况,就是当某一条数据起源有提早的状况下,这笔数据会被失落,这是 Flink 1.16 正式版之前的状况。在 Flink 1.17 版本中,社区的小伙伴曾经把这个代码合并进去了,后续很期待在新版本中应用这个性能。
当数据提早进行补回的时候,咱们的解决形式是,把提早数据和过后关联的上下文,放到音讯队列里,通过流从新生产进去,并依据过后关联的上下文,从新从数据存储里把写进去的会话查回来,而后用同样的逻辑从新把这笔数据补回更新,写回数据库。
这样整个过程中无论是实时关联,还是提早数据的补回,用的逻辑都是齐全一样的,保障了咱们解决逻辑的简洁和一致性。
最终咱们用 Flink 实时关联进去的业务会话会被存储起来以供检索,并通过 Luna 平台以行为树的模式进行展现。
HTAP 风控平台建设
当咱们实现了算法可行性测试,并应用 Flink 实现了技术原型后。接下来就是如何把这一整套框架平台化,使其成为便捷、精确、丰盛的风控平台。
风控平台须要做到以下这些性能。
反对宏观排障,能够具体查问某一笔订单、业务会话过后的业务场景,把它还原进去;反对从宏观上统计整个环境的各种数据量。且配置和查问都须要是自助、向导式的。
基于以上的思考,咱们设计了 HTAP 实时风控平台 Luna。基于这个平台,用户就能够本人从各种异构数据源中抉择,配置业务行为树和剖析模板。而后平台会依据配置好的模板,起 Flink 流算出业务会话的后果,造成会话后果存到存储层。且反对用户从平台上进行条件检索,进行多维度的聚合。
剖析模板的配置咱们是做了自动更新,也就是所有平台上的更新都无需人工运维。
从上图中能够看到,外围组件是计算层的 Flink,加上存储层的 TiDB,加上咱们本人基于 JavaScript 的平台服务零碎。目前能够达到宏观查问是毫秒级,多维度的风控聚合后果在年级别都能够做到秒级查问。
咱们的平台反对,用户从不同的数据源中选出,须要参加这一次关联剖析的数据和关注抽取的字段进行配置。配置好后,Flink 会依据这些配置,主动生成出 Flink 的 Source 和 Sink。
而后进行行为树的定义。定义整个业务行为会产生的动作,实质就是用人力运维排障方法论进行积淀和泛化,将配置的模式固化下来。之后这些配置模板就会用于生成 Flink 流的 UDF 配置,并被实时同步到运行中的 Flink 流中。
除此之外,配置界面还提供了预览性能,即能够一边配置一边预览整个行为树。
风控场景上的剖析模板批改后,如果不波及数据源的增减,咱们的流能够通过 broadcast stream 的个性进行主动同步和变更。
从架构图中能够看出,咱们抉择了 TiDB 作为关联后果的存储层。那么咱们是如何思考的呢?
- 数据后果须要灵便可拓展,且适配索引。这样用户就能疾速的自在配置抽取字段。
- 频繁的更新操作。因为咱们的计算逻辑决定了咱们会结构基准数据,再结构补充数据,以一种异步的模式写到数据库,所以须要频繁更新。
- 齐备的聚合函数。因为宏观统计须要做各种各样的聚合,以满足咱们数据分析统计的需要。
- 满足业务需要的写入 / 读取速度。
这样就能够应用列转行的构造,存储到咱们的关系数据库里了。
列转行是把会频繁产生增减字段的 DDL 转化为 DML,就能够反对咱们灵便的数据结构。
每个字段都须要索引这样的个性,这在数据量继续增大的表上,就有着十分优良的个性。
在这样一种存储构造上,咱们的宏观业务会话查问就能够做到毫秒级,灵便联合多种条件进行检索,以帮忙运维人员疾速查看线上危险和可能产生的故障起因。
当咱们点击查看任何具体的业务会话时,公共平台就会展现出以后这个业务会话的业务行为树,并抽取出有助于排障的一些关键字段和二级指标,极大不便了咱们的运维人员排查具体问题的场景。对于常见的问题,咱们甚至还会用论断模型间接给出风控论断,让咱们的运维人员进去就能马上看出问题所在。
对于宏观统计,大家必定也想到能够应用 SQL 作用在下面来进行统计了,毕竟咱们把数据存在了关系型数据库 TiDB 里,但这里还存在着一些坑点。
当咱们的数据量超过 10 亿的时候,咱们的数据聚合工夫会呈现一些变动。比方当粒度是一小时,聚合工夫是一天的时候,咱们数秒能够实现。但当咱们把工夫拉到 60 天,简直就出不来了。
在查看数据存储层的时候会发现,TiKV 曾经 IO 满了,而且 CPU 飙升,因为咱们做的数据量切实是太大了。
通过剖析整个执行打算能够看到,TiKV 应用惯例的模式进行 SQL 把所有数据捞到 TiDB 层进行聚合计算。这样做获取的数据函数会十分多,随着咱们工夫区间的增大会越来越迟缓,这样咱们必定是不能承受的。
那么咱们来回看一下风控的 AP 需要,咱们须要读取大量实时的关联的数据点;反对有简单的聚合函数,且咱们的查问不应该影响到 Flink 流进行 TP 写入。
这个时候就会想到,TiDB 有一个叫 TiFlash 的组件,它能够实现 TiDB 的 HTAP 个性。也就是 AP 和 TP 同样用 SQL 来实现,且它是物理隔离的,这就十分的实用于这样的场景。
TiFlash 伪装成一个 Raft Learner TiKV 节点,退出 Raft Group,参加数据实时、事务性同步。这样就能够做到 AP 和 TP 的物理隔离,并且它还反对事物,这样就能够在执行 SQL 的时候无感进行 HTAP 了。
在进行这样的优化后咱们能够看到,当咱们的查问蕴含多层 join,甚至有分位数计算的时候,90 天聚合工夫,粒度查问能够在十秒内返回和实现,这能够说是一次质的飞跃。
最初,咱们把宏观统计提供给用户。在 TiFlash 的助力下,咱们的平台能够做到秒级的 AP 多维度聚合查问。这种聚合查问进去的后果能够让咱们的数据分析人员,从更高层次对整个业务环境的危险进行辨认。
晋升风控后果数据能效
当咱们能够实时产生业务会话的后果,并在平台上展现的时候,接下来咱们将通过以下几点进步数据效力。
- 风控论断生成:节约反复人力老本
- 标签和统计:将详情数据归类统计为宏观数据
- 数据打宽:减少剖析维度
- 可视化展现:开掘数据法则
那么咱们为什么把数据存储在 TiDB 这样的一种关系型数据库里呢?
因为 TiDB 作为一个分布式数据库,被咱们宽泛存储各项业务的事实和维度数据了。如果咱们把风控数据簇也放在这外面,通过简略的业余操作咱们就能够实现数据的拓宽,丰盛咱们的数据报表。
不仅是产生离线报表的时候能够这么不便的转,咱们在实时计算的时候,也进行了 Async Join,通过 Async Join 转 UDF 进行实时数据打宽,同时咱们反对多种存储介质。
对于这种 Async Join,咱们利用了 Flink 的 Async IO 的个性,并在 join 的时候进行了一些优化。比方进行批的 join,不同工夫水位线的缓存 join 以及 timeup 数据的侧输入等等,这些都为数据的准确性提供了保障。
通过数据打宽后,咱们的风控统计分析维度就能够更上一层楼了。之前通过 ID 无奈做到的非凡聚合,当初把数据打宽,都能够进行可视化的一些剖析和展现了。
除此之外,对于常见问题,咱们反对事后配置论断模型。当运维人员实时查问宏观会话时,间接为他们给出论断。
失去论断后,咱们就能够从更高的角度,察看和统计整个业务环境的宏观状况了,甚至能够进行实时的业务环境监控。从而进步故障的发现率、预警率、预警的准确率以及整个运维人力的能效。并且通过可视化的展现能够使咱们的风控平台更精确的提供服务。
倒退历程与展望未来
早在 2017 年咱们就对实时计算开始调研了,并在 2018 年造成了双向倒退的布局,别离是平台化和 SDK 手脚架的革新,通过多层的迭代,最终造成咱们的一站式运维平台。
随着平台和 SDK 的倒退,咱们的实时业务线也越来越宽泛。比方从最早的日志剖析监控,到通用的解析 ETL,到用户画像,到简单的关联剖析,再到现在的实时风控平台,咱们也是在实时畛域越走越远,这都是 Flink 给咱们带来的改革。
将来咱们心愿,能够实时风控平台能够反对更多的性能。比方咱们心愿反对用 Flink-SQL 即席查问风控后果;用户反馈驱动的风控模型修改;联合 Flink-ML 开掘更深层次数据价值。