冯鑫 | 业务安全系统浅谈

简介:

对于一个互联网公司而言,业务发展的不同阶段,对“业务安全”有着不同的目标和需求。自己已经在互联网物流行业(车货匹配)走过了近2年的时间,车货匹配对“业务安全”的目标和需求可以简单概括为:

1. 从业务功能角度

- 保障核心业务安全

“货主发货、司机找货”的场景中,货主发布的货源信息,司机的期望是拉货的需求真实的,信息的内容是规范的(不含敏感词等);而货主的期望是承接运单的司机是真实的,可靠的,有真正拉货需求的,从而保障交易。

“反机器人爬货、恶意骚扰”的场景中,系统可以识别是机器人在对平台进行浏览货源信息,并进行屏蔽、蜜罐;

“司机与货主投诉”的场景中,提供接口让用户对货源交易中的不公平、不公正情况进行投诉,并离线分析投诉的可靠性、真实性

- 保障运营活动安全

“车货匹配的业务运营活动”场景中,有过“发多少次货”送“多少”积分、拨打“某类”货源送多少“积分”等。因此,防止“薅羊毛”也是一个很重要的需求

2. 从系统架构角度

- 业务安全系统需要是独立的,可降级的(在线的生产系统部分)。核心车货匹配系统(优化排序服务、搜索服务、货源服务等)与业务安全系统有着接口调用的耦合度,因此为了保障核心系统可靠,业务安全系统需要集成到统一的RPC管理框架及应用配置管理系统中,以实现统一的熔断、限流及业务/系统开关控制

- 业务安全系统需要有汇聚“业务安全”相关的各类大数据,围绕大数据存储系统,之上构建一套集抽取、转换,分析的系统及报表系统(离线的系统),可以让数据分析师、产品经理追溯数据(下钻、上卷等)。并可以离线地训练各类机器学习模型(增加、修改模型),对每个用户的行为数据进行事后离线甄别和事中的实时甄别

- “实时的甄别用户行为” 需要一套规则引擎,以达到产品经理可以随时根据离线学习的模型及业务规则进行线上规则改进,并且系统服务不重启

- 其他的诸如与用户中心系统对接、统一配置中心系统对接,就不赘述了。

再来说说业务安全系统的架构吧

先上张架构图

66e9a145c226ddd9da025756ac1d969665076bfe

系统架构

根据系统的调用场景,将系统服务分为“在线”的供核心系统实时调用的系统及“离线”的用户行为分析系统服务(其中,大数据实时计算平台和业务安全规则引擎服务完成事中的规则判定)

1. 在线部分

- 业务安全业务接口层,提供在用户发货、找货时判定用户是否属于某类嫌疑用户或者应该禁用的行为

- 业务安全惩罚中心服务,维护各类被惩罚、投诉的用户信息及惩罚配置

2. 离线部分

- 实时计算平台+业务安全指标转换与增强服务+业务安全规则匹配引擎,构成了离线的对用户行为指标实时统计及规则匹配的过程,离线(近实时的)对用户行为进行监测、惩罚

- 业务安全大数据分析平台,提供事后的用户行为数据分析,可以拓展各类模型,对用户行为进行学习分类。同时,对数据进行转换、聚合(构建用户行为数据维度的大宽表),供BI系统和指标监控系统分析读取。

这一篇简单总结一下业务安全系统在‘非主站应用’环境下的‘指标转化与增强’、‘业务安全规则引擎’两个服务在当初设计时的一些考虑。

首先,为什么需要这两个服务?

背后的逻辑是这样的,‘业务安全’系统为了能够识别用户的“非法”行为:

- 需要不断收集用户在平台上产生的各类行为数据,数据流向“实时计算平台”和“大数据存储平台”

- 基于数据,对业务安全关注的各个‘指标’/特征值 (针对的都是每个用户的‘指标’,如,‘过去30(指标可配)分钟内的货源的点击次数’,‘司机过去3个小时(指标可配)内的GPS 位移距离’,过去2个小时内(指标可配)手机的重力感应数据变化等等) 进行累计计算(’指标‘累计计算的公式,通过后台配置自动生成代码在实时计算平台上进行执行、存储结果

- 业务安全规则的定义(用groovy或 js 等语言描述的snippet -- 我们用的js)在后台配置,配置结果是一组按‘场景’组织的可执行的rule set(规则集,其中每个rule 分为rule trigger和rule action 两个部分(其实是一些用js写的 snippet codes)及规则中所关联的各类‘指标’/特征值

fc6186e894327e4b81a4ae30d6701566042b6dfb

例子-业务安全规则定义

- 通过实时计算平台,将用户行为数据进行过滤,并按‘场景’ 分类输出(输出成raw_event_data)。这里‘场景’(通过sceneId表征,见上图)的概念在车货匹配业务中分为,‘searchCargo’(货源搜索), 'viewCargo'(查看货源), 'phoneCall'(拨打货源),‘发布货源’(sendCargo),‘填写货源备注’等等(也可以组合定义)。‘场景’ 的定义不仅用于分类输入给 '指标转化与增强'服务的raw_event_data, 还用于关联输入给规则引擎的事实数据(rule_fact_data)及规则的定义部分(rule set)

(铺垫了这么多,才讲到“为什么” ~~~~)

- '指标转化与增强'服务将消费MQ(kafka)中的raw_data,根据其sceneId 来匹配所定义的业务安全规则集(rule set),及rule set 关联的‘指标’定义,来“转化和增强” raw_event_data 成为rule_fact_data

18fdc99efc310d4bc98cf79f55311d7926038a21

例子-Raw_Event_Data 结构

35b6f23477eef8c60d1a3cdcfa253130b7874932

例子-Rule_Fact_Data 结构

- '规则引擎'服务则接收rule_fact_data, 根据其中的sceneId 来匹配rule set 并执行每个rule 的rule trigger 部分和rule action 部分。 脚本引擎采用的是java 8 中的nashorn。 当初决定采用哪种语言(甚至开源的rule engine 框架)来描述和定义规则,着实有一个曲折决策的过程

-- 我们看了drools。但认为drools 着实有些重,虽然对于各类复杂的rule set 的组织(一个完备的规则引擎所需的“规则互斥”、“规则冲突”、“规则执行顺序”设置等能力均支持良好)及执行效率支持的非常好,但真的不太适合我们的场景。我们预想的是,随着系统的不断演进,情况可能真不是像预想的那样美好---- “提供一个各项规则配置能力灵活的后台,产品或运营同学可以信手拈来随意配置各种复杂的业务规则”,而实际上却可能更加骨感一些 ---- “提供有限的场景及指标的定义,通过后台来配置成业务安全的规则;生成规则的过程,通过预定义的规则模板来生成。个别的情况,可以提供一个text 框,让RD 来辅助写rule codes 且可以实时地更新到线上并生效”。在这种考虑之下,drools 就pass 了,而决定采用某个脚本语言来自己实现一个规则引擎

-- 至于脚本语言的选择,就没那么纠结了。当时,在其他项目里面已经有采用js 来构建规则引擎的使用经验(很简单的使用),虽然groovy 是一个很好的option (JS 和 Groovy 都‘近’ java,都比较容易集成使用),但还是放弃了(考虑时间等等成本)

再补一张图,应该就更清晰了

22d2c9ac53be731633ab1e2acaf7baf2ee6f418e

调用时序图

PS:

整个业务安全系统(工程部分)从最早的版本更新上线到目前的版本大致花了一个多月的时间,其中对设计思路、协议定义规范、脚本语言的选择等等架构决策也偶有反复,废弃了一些原有的代码,但团队最后还是都坚持了下来。整个过程走过来回头来看,留下的也都是财富。


原文发布时间为:2018-03-28

本文作者:冯鑫

本文来自云栖社区合作伙伴“中生代技术”,了解相关信息可以关注“中生代技术”微信公众号

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
人工智能 自然语言处理 安全
从 ChatGPT 到 AI 大模型私有化部署,为什么企业需要私有化专属大模型?
目前,大模型已经能够切实的影响到我们每个人的工作、学习、生活,赋能千行万业,但是开放的大模型却无法很好的适应企业或单位的内部需要,为此,此处研究并提出为什么企业需要私有化大模型,并探讨私有化大模型的优势和挑战,同时本文也举出了一些实践落地的例子,希望能给读者带来一些思考和启发。
|
机器学习/深度学习 算法 Java
JAVA敏感词快速检测、过滤
本文章参考借鉴于https://blog.csdn.net/weixin_45444807/article/details/132249763?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%95%8F%E6%84%9F%E8%AF%8D%E6%A3%80%E6%B5%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-132249763.nonecase&spm=1018.2226.3001.4187
2771 1
|
8月前
|
人工智能 运维 Serverless
一键部署 Qwen3! 0 代码,2 种方式全新体验
Qwen3 正式发布并开源 8 款混合推理模型,包括两款 MoE 模型(Qwen3-235B-A22B 和 Qwen3-30B-A3B)及六个 Dense 模型。这些模型支持 119 种语言,在代码、数学等测试中表现优异,并提供思考与非思考两种模式。依托阿里云函数计算 FC 算力,FunctionAI 平台支持模型服务和应用模板部署,适用于多种场景。用户可通过 Serverless 架构快速构建高弹性、智能化应用,显著降低开发成本,提升效率。试用链接及详细文档已提供,欢迎体验。
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
编解码 人工智能 缓存
通义万相重磅升级,成功登顶VBench,阿里云百炼邀您第一时间体验
阿里云通义万相推出2.1视频生成模型,大幅提升复杂运动、物理规律遵循及艺术表现,在权威评测VBench中夺冠。新模型采用自研VAE和DiT架构,增强时空上下文建模,实现更稳定的大幅度肢体运动和多对象生成。通义万相支持中英文文字特效生成,满足广告设计、短视频等创作需求,并在阿里云百炼平台开放API调用,提供免费试用资源。
1267 0
|
Java API
QLExpress功能清单
QLExpress从一开始就是从复杂的阿里电商业务系统出发,并且不断完善的脚本语言解析引擎框架,在不追求java语法的完整性的前提下(比如异常处理,foreach循环,lambda表达式,这些都是groovy是强项),定制了很多普遍存在的业务需求解决方案(比如变量解析,spring打通,函数封装,操作符定制,宏替换),同时在高性能、高并发、线程安全等方面也下足了功夫,久经考验。
22141 1
|
缓存 JavaScript 前端开发
react.js高级用法
【8月更文挑战第27天】react.js高级用法
252 2
QLExpress的基本语法
1、操作符和java对象操作 普通java语法 //支持 +,-,*,/,<,>,<=,>=,==,!=,<>【等同于!=】,%,mod【取模等同于%】,++,--,&&,|| //in【类似sql】,like【类似sql】,&&,||,!,等操作符 //and、or 和java里面的&& || .
27926 0