陈建平,后台开发工程师,现就职于TEG安全平台部-业务安全中心,主要负责中心实时策略风控平台开发。
随着部门在业务安全领域的不断拓展,围绕着验证码、金融广告等服务场景,腾讯水滴作为支撑业务安全对抗的实时风控系统,上线的任务实时性要求越来越高,需要支撑的业务请求量也随之增加。对于业务快速上线和资源快速扩缩容的需求,且公司自研上云项目往全面容器化上云方向推进,水滴风控平台开始进行自研上云的改造。本文主要针对腾讯水滴平台上云过程中的实践总结,希望对其他业务迁移上云有一定参考价值。
腾讯水滴平台主要是用于业务安全对抗的高可用、高性能、低延时的实时风控策略平台,提供一系列的基础组件给策略人员进行构建策略模型,能够帮忙策略人员快速地完成策略模型的构建和测试验证。
水滴系统架构如下图所示:
水滴实时风控平台系统主要由配置处理模块和数据处理模块两部分组成。
配置处理模块:主要由前端 web 页面、cgi 、mc_srv 和 Zookeeper 等组成。策略开发人员通过在水滴前端页面进行策略模型的编辑、策略任务的创建、上线和更新操作,构建完成的策略模型信息以 json 格式通过 cgi 和 mc_srv 接口存储到 Zookeeper 数据中心,数据处理模块通过 agent 拉取 Zookeeper 上不同业务对应的策略信息。
数据处理模块:主要由 access、engine 和外部系统等构成,核心处理逻辑为 engine 模块。不同业务启动独立的 engine 实例以确保业务间的隔离,业务数据请求通过发送到指定北极星服务地址或者 ip:port 地址,由 access 接入层接收请求数据后根据任务号转发到对应任务的 engine 实例上,存在外部系统访问组件的情况下 engine 会将请求数据查询外部系统。
在腾讯水滴平台改造上云过程中,先对 TKE(Tencent Kubernetes Engine) 平台进行了特性熟悉和测试验证,并梳理出影响服务上云的关键问题点:
针对上述自研上云的关键问题点,我们分别从指标改造、容器化改造、流量分发优化等方面进行改造优化以保障业务服务上云顺利。
水滴平台采用 Monitor 监控系统进行系统指标视图查看和告警管理,但迁移上云过程中发现 Monitor 监控指标系统存在不少影响上云的问题点,为了解决原有 Monitor 指标监控系统存在的问题,我们将指标监控系统由 Monitor 监控系统改造为智研监控系统。
Monitor 监控指标系统的指标上报主要是属性 ID 和属性指标值,针对不同指标需要预先申请属性 ID ,在平台系统实现过程中集成 Monitor SDK 进行不同属性ID的埋点调用。如:不同任务请求量指标需要预先申请属性 ID。
在使用智研指标改造过程中,我们平台系统实现中集成了智研 Golang SDK ,将原有的 Monitor 指标上报进行了智研调用改造,智研指标改造过程中最重要的是从 Monitor 系统的单属性指标思路需要转换到多维度指标下,需要对智研维度和指标概念有一定的理解和指标设计。如:设置任务维度,任务取值通过调用上报实现。
智研指标和维度设计:智研的指标在实现改造过程中,最主要是理解指标和维度的含义。
指标: 作为一种度量字段,是用来做聚合或者相关计算的。
维度: 是指标数据的属性,通常用例过滤指标数据的不同属性。维度属性采用指标数据中能够进行统一抽象的特性,如实例 IP、任务号、组件 ID、指标状态等维度,无法抽象成维度的属性则作为指标属性。智研指标改造前期,未进行合理的维度设计,导致指标和维度选择过于混乱,不便于后续的增加和维护。
智研指标改造完成后,我们对平台侧和业务侧的指标告警进行区分,将业务侧相关的指标告警通过告警回调方式直接转发给业务侧,及时通知业务侧进行异常情况的处理,提高了业务侧接收异常的及时性且降低了平台侧处理业务侧告警的干扰。
优化智研指标视图 Dashboard 展示,将常用的智研指标视图整合到智研 DashBoard 页面,方便运营人员快速了解关键指标情况。
采用 CL5 进行请求路由情况下,当容器实例采用 NAT 模式时,使用 CL5 接口无法获取到物理机 IP 地址,从而导致请求数据就近访问失败。将负载均衡 API 接口由 CL5 调整为北极星服务接口后,采用北极星接口能够正常获取 NAT 网络模型下容器实例所在物理机 IP 信息,从而能够实现就近访问。
CL5 迁移北极星过程中,将原有的 CL5 SDK 替换成北极星 polaris-go(Golang 版本 SDK)北极星 polaris-go 使用示例:
//***********************获取服务实例***************************
// 构造单个服务的请求对象
getInstancesReq = &api.GetOneInstanceRequest{}
getInstancesReq.FlowID = atomic.AddUint64(&flowId, 1)
getInstancesReq.Namespace = papi.Namespace
getInstancesReq.Service = name
// 进行服务发现,获取单一服务实例
getInstResp, err := consumer.GetOneInstance(getInstancesReq)
if nil != err {
return nil, err
}
targetInstance := getInstResp.Instances[0]
//************************服务调用上报*************************
// 构造请求,进行服务调用结果上报
svcCallResult := &api.ServiceCallResult{}
// 设置被调的实例信息
svcCallResult.SetCalledInstance(targetInstance)
// 设置服务调用结果,枚举,成功或者失败
if result >= 0 {
svcCallResult.SetRetStatus(api.RetSuccess)
} else {
svcCallResult.SetRetStatus(api.RetFail)
}
// 设置服务调用返回码
svcCallResult.SetRetCode(result)
// 设置服务调用时延信息
svcCallResult.SetDelay(time.Duration(usetime))
// 执行调用结果上报
consumer.UpdateServiceCallResult(svcCallResult)
根据腾讯水滴平台架构图可知,业务方在水滴平台创建不同的任务后,水滴平台上会启动不同的 engine 实例进行对应任务的计算操作,水滴平台任务与水滴任务 engine 实例呈1:N 关系,任务越多需要部署上线的 engine 实例越多。为了快速地上线不同的水滴任务 engine 实例,我们需要能够确保任务对应的 engine 实例快速的部署上线,因此 engine 实例模块进行容器化和自研上云能够提升运营效率。
水滴平台数据处理模块随着请求量的变化,需要对 access 实例和 engine 实例进行扩缩容操作,因此对 access 和 engine 实例会进行频繁地扩缩容操作。
腾讯水滴数据处理模块架构图:
水滴平台在进行迁移上云过程中,自研平台迁移到 TKE 云上后带来了不少的效率提升,上云后带来的效率提升主要有以下方面:
互动赢好礼
精读文章,回答问题赢好礼
Q1: 业务上云过程中,有什么可以提升资源使用率的经验?
Q2: 业务上云过程中,有哪些服务无状态化改造经验?
8月21日上午12点,由作者选出回答最佳的2位读者,送出可爱蓝鹅一只。
往期精选推荐