微信月活破10亿,安全性靠谁来支撑?

news2024/11/23 15:46:59

d55a9152b5265bff5ff3099afcdd313a.png

16429064de6e60ead56cf1840df38afe.gif

👉腾小云导读

微信作为月活过10亿的国民级应用,其安全能力备受关注。值得注意的是,没有足够的特征数据,安全策略将是"无根之木,无源之水"。微信安全数据仓库作为安全业务的特征数据存储中心,每天服务了万亿级的特征数据读写请求,为整个微信安全策略提供了可靠的数据支撑,是微信安全的一块基石。事实上,微信安全数据仓库不仅仅是一个存储中心,更是一个特征管理和数据质量管理的中心。本文将介绍安全数据仓库的起源、演进、当前的架构设计和数据质量保证系统的实现,请往下阅读。

👉目录

1 业务背景

    1.1 安全策略开发流程

    1.2 为什么需要数据仓库

    1.3 安全业务后台架构

2 数据仓库架构演进

    2.1 存储选型

    2.2 架构设计和演进

3 数据质量保障

    3.1 特征标准化

    3.2 数据空跑系统

4 总结

01

业务背景

   1.1 安全策略开发流程

安全业务的核心逻辑在安全策略中实现。整个的策略开发流程包括特征数据的收集、安全策略的编写实现和策略的反馈评估。其中特征数据的收集是必不可少的环节,数据的质量将直接影响安全策略的效果。

3f8af6ea94438b777b155cf4ac1e8d63.png

特征数据收集主要包括:数据接入、特征的计算、特征的存储。

在数据仓库还未建立时,业务同事通过消费离线存储 mmdata 和 tdw 接入数据,通过 Flink 流式计算或者自定义模块对数据进行加工,计算出需要的特征,最终存储到自行维护的 KV。然后在安全策略平台上编写安全策略,读取 KV 中的数据,,实现需要的安全逻辑。

55fcfed6f573a563d6bdae3a567f6e71.png

传统特征数据收集流程


   1.2 为什么需要数据仓库

前面提到在还未建立数据仓库时,业务同事都按照自己的方式去存储计算出的特征,大多通过自行申请部署 KV 来存储,如 A 同事把部署一套 KV 集群,存储特征到 KV 表中,B 同事把特征存储到同 KV 集群的不同表中,C 同事又额外申请了另外一套 KV 集群存储。如下图中的架构:

15530d75e58e2569a875e14335b05214.png传统安全后台: 各业务特征分散存储

这种特征的分散存储,导致业务同事只了解自己熟悉的特征,难以交流和共享,特征缺乏统一的管理,数据质量难以保证。不同的存储方式,也导致特征访问接口的混乱,业务系统的可靠性也难以保证。

针对上述的问题,我们希望把所有业务的特征,按统一的规范,建立统一的存储,方便特征的共享、管理和维护、并建立数据质量保障体系, 为策略提供可靠的数据。所以我们需要开发数据仓库。

7617c2b7b3301a857287ef877ca311cb.png问题和目标

   1.3 安全业务后台架构

当前我们已经把所有的安全策略统一到安全策略平台进行开发和管理,特征数据的接入和计算统一到了 Flink 实时计算平台和特征平台。

数据仓库作为承上启下的部分,对上为在安全策略平台上的安全策略提供了数据读写,对下为实时计算平台和特征平台计算输出的特征提供了存储,是整个业务体系中不可或缺的部分。

7c4f934bc9f3a0794fa60553d844d195.png

安全业务后台架构

02

数据仓库架构演进

   2.1 存储选型

安全业务特征数据主要有2种类型:

离线特征:用来满足离线计算数据导入线上实时使用的需求,通常特征离线计算,定期的批量后台上线,提供在线读,但不支持实时写入。

实时特征:用来满足实时的在线读写需求。

腾讯有多种非常成熟稳定的自研 KV:实时读写 KV(简称实时 KV)、离线写实时读 KV(简称离线 KV)、其他 KV 等等。这些 KV 已经在多个业务被验证,有非常好的性能和可靠性、有团队做长期的维护。其中,部分 KV 比较适配数据仓库的底层存储的需求。其主要特点如下:

存储KV特点是否选用
离线写实时读 KV非常适用大量 key 的定时批量更新,在线只读,具有版本管理功能,支持版本历史版本回退,具有非常优秀的读性能。
   是
实时读写 KV强一致性的 key-value 服务,存在类 MySQL 的表概念,提供了 Select Insert  Update Delete 接口,在单表操作保证 ACID,支持过期淘汰 TTL。   是
其他 KV提供强一致性的 key-value 读写服务,类似 STL 中的容器,不支持 TTL, 不提供新集群,不建议使用。   否

离线 KV :适合离线特征要求的场景。拥有非常好的读性能,并且提供了版本管理功能,在处理有问题数据时可以非常方便地回退版本,采用这种 KV 存储时,value 一般是 protobuf 对象,新增特征时可以在 pb 中增加字段。

实时 KV :适合实时特征的场景。在线实时读写性能优秀,而且支持数据过期淘汰,该 KV 提供了类 MySQL 表的概念,KV 表定义类似于一个 MySQL 表,而每一个安全业务特征刚好可以用表的一个字段表示。

   2.2 架构设计和演进

2.2.1 统一存储统一接口

数据仓库第一个版本,针对特征存储分散访问接口混乱问题,首先部署了公共的实时 KV/离线 KV 集群,并实现了一个接入层。新增特征和历史特征放到公共的 KV 存储集群,并且在接入层屏蔽了底层 KV 的细节,提供了统一的读写特征的接口。

2cac70c162aa3edca45c027f3e5bbf75.png

数据仓库架构1.0

接入层支持任意多个 KV 集群,支持多个表,为屏蔽 KV 的细节,接入层为每个特征分配唯一的标识<sceneid, columnid>,读写特征数据使用唯一标识进行,不需要关注 KV 类型和 KV 表 ID,方便业务的接入使用。

9b9899bc79363adf6d6768d637a3407d.png

统一接口

接入层还实现配置管理、参数校验、模块校验、权限校验、流水上报、PV 统计等功能:

功能

说明

配置管理

数据仓库未开发时,业务上线特征需要在 KV 中新增字段,需要重新发布 KV 配置,整个流程非常的低效,为此数据仓库为接入的 KV 预先申请一定数量的字段,在配置文件中为特征分配<scenid, columnid>,并映射到具体的 KV 集群和表字段,每次特征上线只需要发布配置即可,配置管理提供了配置的解析,加载,热更新等功能。

参数校验

检查输入的读写参数是否正确,如访问不存的集群,不存在表,参数提供的类型和特征实际类型不匹配:如参数是 int,实际特征是 string 类型。

模块校验

检查请求来源模块是否有读写具体某个特征的权限。

权限校验

检查请求来源人是否有读写某个特征的权限。

流水上报

上报数据仓库读和写的流水,方便问题排查和运营。

PV 统计

统计特征读 PV,包括接口维度、模块维度等等,用于后续运营。  

   2.2.2 读写分离和多 IDC 同步

  • 读写分离

数据仓库的读请求量远远多于实时写入量,为了提高性能,减少读写之间的相互影响,接入层做了读写分离,将读和写接口拆分到两个模块。

  • 数据多 IDC 同步

数据仓库和业务都采用的是多 IDC 部署。为了不降低查询性能,不希望业务跨 IDC 访问存储,所以底层的 KV 也是多 IDC 部署。

这里就带来一个问题,特征数据如何在多 IDC 的 KV 之间进行同步?例如业务在上海写入一个特征,希望在深圳也能读到这个特征。这里按特征类型进行分类处理:

离线特征数据同步:离线特征数据上线流程是通过离线计算在文件系统中生成一个文件,然后将文件导入到离线 KV, 而离线 KV 支持多个 IDC 共享同一份数据,数据文件只需要生成一份,所有 IDC 的离线 KV 拉取同一个文件,新数据最终能同步到所有 IDC 上。

实时特征数据同步:实时特征的同步采用微信自研的分布式队列组件,该组件提供了高可靠、高可用、高吞吐、低延时的数据消息队列服务。数据仓库写接入模块在写入数据时,同时将数据写一份到分布式队列,使用队列做跨 IDC 的数据同步,在其他 IDC 启动进程消费队列中的数据,写入到本 IDC 的实时 KV,实现实时特征数据的同步。

971ceb35d7994fd49aaa8c1c3eac53ec.png

数据仓库架构2.0

   2.2.3 异步写和替代分布式队列

  • 异步写入

前一个版本中实时特征是同步写入,影响业务的性能,业务希望是异步写入。

  • 替代分布式队列


前一个版本中分布式队列采用的是公共的集群,众多业务使用,出现过数据仓库受干扰影响特征数据同步。

为此在数据仓库中新增一个异步消息队列模块写 MQ,用于异步写入。和分布式队列相比 MQ 更轻量,而且 MQ 我们可以自行维护, 更可控。所以新架构中通过 MQ 实现实时特征的多 IDC 数据的同步,替代了分布式队列,保证数据同步不受其他业务影响。

b975d9d5d415301db5cdcd7c9477d81e.png

数据仓库架构3.0


   2.2.4 运营系统

前面3个版本解决了特征存储分散、读写接口不统一、数据同步、读写性能问题,但是特征的上线依然采用的是配置发布上线的方式,效率依然低效。

更重要的是特征缺乏统一的管理,共享困难,难以满足业务的需求,业务常常也有各种疑问:

ea4f23245dfbee38fc6407f1b3986857.png

为此数据仓库新增运营系统模块,实现了特征申请、特征上线、特征管理&分析、特征值查询/修改、特征数据质量管理等功能。

82b1f9befe0121eec0c107b30613dd26.png

数据仓库架构4.0

  • 特征申请

用户不再需要手动的修改配置文件来新增特征,可直接通过 WEB 页面申请,填写必要的特征信息,通过通用审批系统进行审批。

  • 特征上线

用户不再需要手动的发布配置上线特征,无论是新增的实时特征还是离线特征,审批通过后将自动化的上线,提升体验和效率。

  • 特征管理

特征管理支持对特征 meta 信息进行查询和修改,包括特征所属的业务分类(索引)、特征类型、特征负责人、给特征打 tag 等等,业务可以方便的查询需要特征信息,避免重复的计算,方便各业务共享特征。

f93572cf9ecec8c51ba03670126b698b.jpeg

  • 特征分析

追踪特征的原始数据来源、计算过程、数据流路径、最终的存储信息等等, 可以追踪特征完整生产流程。

7c89122bfe6e6ed5f209d7d84516612d.jpeg

  • 特征值查询&修改

运营系统支持在 WEB 页面查询特征值和修改特征值。

1638e05cea80db2acf111cd90565aec3.jpeg

  • 特征数据质量管理

保障数据质量,下一章节详细讲述。

03

数据质量保障

数据仓库主要通过两个方面来保障数据质量:特征的标准化和数据空跑系统。接下来我们进行详细介绍分析。

   3.1 特征标准化

特征的标准化是保证数据仓库数据质量的手段之一,标准化是指对数据仓库中的特征进行规范化处理,使得特征能够达到一致性、可重复性等标准,从而提高数据的可靠性和准确性。

对于新增实时/离线特征,数据仓库制定了的特征规范文档,并按规范文档的要求,特征申请/管理页面必须正确的补充完整特征信息,如特征类型、业务分类等等,后台对每个特征都会进行校验,不符合规范的特征无法录入。

另外数据仓库还提供了接入编程指导文档,并给出完整的 C++编程实例,致力于提供标准化的编程最佳实践。

   3.2 数据空跑系统

离线特征数据来自于业务离线计算在分布式文件系统中生成数据文件,然后将文件上线。历史上曾因为生成的数据文件存在错误,存在错误的文件数据被上线到离线 KV,导致策略出现故障。

为了保障离线特征数据的质量,数据仓库设计了一套空跑系统,在上线前对数据文件进行检查,避免存在问题的数据上线到现网。

b98788020222b0b1c1ca3e75ceb75361.png

数据空跑架构

数据空跑架构如上图,离线特征数据的上线也纳入到了运营系统的管理中,整个的空跑流程如下:

  • 业务发起数据上线,运营系统将数据上线到备用的离线 KV 表,也就是用于空跑的 KV 表。

  • 打开空跑开关,按一定的比率采样现网的读请求,旁路到新增的读 MQ 模块,该模块读空跑表的数据,和当前现网做对比, 分析差异率。这里采用的动态采样, 如果表的 PV 高则采样率低,PV 低则采样率高或者100%采样,避免请求量小的表无法进行空跑,而请求量大的表空跑流量太高又消耗太多资源。

  • 计算和分析差异率。如果差异率超过了阈值,就自动的拦截数据上线,如果阈值检查通过,就继续后续的检查流程,最终自动上线数据文件到现网离线 KV。

差异率示例如下图,详细展示了具体的差异细节:

62e097a6f9cd4d5c5e498f74362f7f0c.jpeg

空跑结果差异率和差异详情

完整的数据上线流程如下图,空跑差异检测通过后,需要检查数据文件完整性,防止文件被修改或者覆盖,最后数据再上线到现网数据仓库系统,通知业务数据上线成功。如果中间任何一个步骤出错将告警给业务负责人,提醒人工介入处理。

7b3b421d3ffb52edf74cb5088db4d583.png

离线特征数据上线完整流程

04

总结

整体来说,我们把数据仓库分散的特征数据全部集中统一管理,提供统一的访问接口,标准化每一个特征,建立了统一的规范。并且在此基础上保障了数据的质量,夯实了整个安全业务的基础,助力一站式的数据-策略开发,极大地提升了安全对抗的效率,实现了数据价值的最大化。以上便是本次分享的全部内容。如果觉得文章内容不错的话,欢迎转发分享。

-End-

原创作者|remyliu

技术责编|robintang

4cedcdca1f2825333f3a9a380f7f82b7.png

你认为数据库与数据仓库的本质区别是什么?数仓与常见的大数据处理框架如何集成?欢迎在评论区分享。我们将选取1则最有意义的分享,送出腾讯云开发者-文化衫1件(见下图)。7月6日中午12点开奖。

cdb0e8494262664826bd41e3e62c9719.png

2b6726e1fa4ea49fe31421f46d9934a5.png

65a1e4c2762413c9fe772d131f587864.png

dddea4e8b9e8edde7a609fbbccf96752.png

75c15ceb8c245d8c25701a3115c00561.png

关注并星标腾讯云开发者

第一时间看鹅厂技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C/C++】解析 类成员属性

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

JVM类加载双亲委派-JVM(二)

上篇文章说了java类的加载&#xff0c;验证、准备、解析、初始化。类的初始化必须是类加载完才执行&#xff0c;所以类的构造方法初始化是在静态方法之后执行。 JVM类加载机制-JVM&#xff08;一&#xff09; 一、类加载和双亲委派机制 前面类加载主要通过类加载器实现&…

JavaWeb小记——登录、注册

目录 登录项目 步骤 1.首先写一个前台页面&#xff0c;一个form表单——login.jsp 2.后台获取前台输入的参数&#xff0c;并作校验 3.写一个JDBC工具类&#xff0c;用来连接数据库&#xff0c;本案例使用Druid连接池 4.写一个登录工具类&#xff0c;在数据库中查询数据&…

【云原生】k8s的pod基础(上)

1.pod的相关知识 1.1 pod的基础概念 pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是用绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管…

C++面试需求

一.auto 1.介绍&#xff1a; auto 是一个用于类型推导的关键字。它允许变量的类型在编译时根据其初始化值自动推断 例子&#xff1a; &#xff08;1&#xff09;自动类型推导变量 // C program to demonstrate working of auto // and type inference#include <bits/std…

shell正则入门

1.系统通配符 * #所有 . #当前目录 .. #当前目录的上一级目录 - #当前目录的上一次所在的目录 ~ #家目录 # #注释&#xff0c;超级管理员的命令行提示符 $ #引用变量&#xff0c;普通用户的命令行提示符 ? #匹配任意…

Spring Cloud Alibaba体系使用Nacos作为服务注册发现与配置中心

文章目录 Nacos介绍服务注册发现Nacos Discovery引入Nacos DiscoveryProvider和Consumer示例ProviderConsumer Nacos Discovery Starter其他配置选项 服务注册发现Nacos Config引入Nacos Config快速接入配置自动刷新profile粒度控制自定义namespace配置支持自定义Group支持自定…

UE5.2 LyraDemo源码阅读笔记(二)

UE5.2 LyraDemo源码阅读笔记&#xff08;二&#xff09; 创建了关卡中的体验玩家Actor和7个体验玩法入口之后。 接下来操作关卡中的玩家与玩法入口交互&#xff0c;进入玩法入口&#xff0c;选择进入B_LyraFrontEnd_Experience玩法入口&#xff0c;也就是第3个入口。触发以下请…

vue进阶-elementPlus

Element Plus官网 Element Plus 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。减少开发者关注css&#xff0c;重心关注业务逻辑。 1. 入门 1.1 安装 npm install element-plus --save1.2 快速开始 1、main.js 引入并 use element-plus import { createApp } from …

C#,数值计算——灰色码(Gray Codes)的计算方法与源代码

一个 n位灰色码 序列&#xff0c;就是2的n次方 个 整数&#xff1b; 第一个数字为0&#xff1b; 相邻两个数字的二进制只有一位不一样&#xff1b; 第一个数字和最后一个数字的二进制也只有一位不一样。 using System; namespace Legalsoft.Truffer { /// <summary&…

ARM Exynos4412 硬件中断和GIC管理、PWM控制 6.28

day7 1.中断 硬件中断&#xff1a;直接让外部的硬件产生中断&#xff0c;CPU获取中断源并执行异常处理流程 1.需求&#xff1a;&#xff08;中断的原理一样&#xff0c;但外设是按键&#xff09;按键产生中断&#xff0c;并在中断处理中串口发送消息 2.原理图&#xff1a;U…

Mysql 5.6使用配置文件my.ini来设置长时间连接数据库

对于已经安装了mysql和未安装都是同样的步骤。在C:\Program Files (x86)\MySQL\MySQL Server 5.6下生成一个my.ini文件。然后删除或者修改my-default.ini的名字。 一、my.ini配置文件如下 [mysqld] basedirC:\Program Files (x86)\MySQL\MySQL Server 5.6 datadirC:\Program F…

STM32F407 基本定时器使用

介绍STM32F407基本定时器的配置方法&#xff0c;分别介绍轮询方式、中断方式使用定时器完成定时。 【1】定时器介绍 定时器相关的章节在STM32F4xx参考手册第14、15、16、17章节。 【2】基本定时器配置示例 增加一个Timer.c文件&#xff0c;代码如下 #include "timer.h…

【sql】SQL回顾总结,超级全

SELECT&#xff1a;语句用于从数据库中选取数据 从 "Websites" 表中选取 "name" 和 "country" 列 SELECT name,country FROM Websites 从 "Websites" 表中选取所有列 SELECT * FROM Websites; SELECT DISTINCT&#xff1a;用于返…

Nacos(一):简介 如何安装 服务注册与发现 集群 权重 与Eureka区别

一、简介 1、应用场景 当服务调用越来越多&#xff0c;服务的地址需要管理起来&#xff0c;并实现动态调用而不是硬编码在接口中。此时需要一个注册中心来帮助我们管理服务。 流程如下&#xff1a; 商品微服务注册IP和端口到注册中心订单微服务先从注册中心获取到商品微服务…

45 # 实现文件拷贝功能

下面实现边读边写的文件拷贝功能&#xff0c;这样不会淹没系统的可用内存&#xff0c;合理读写 const fs require("fs"); const path require("path");function copy(source, target, callback) {const SIZE 3;const buffer Buffer.alloc(SIZE);let r…

OPENCV 训练分类器一

第一步&#xff0c;安装OPENCV 见最新openCV-Python安装教程(opencv-python版本4.4.0, Python版本: 3.9)_python安装opencv_这个人不是画家的博客-CSDN博客 第二步&#xff0c;下面是修正过后的Python 将文件夹下面所有的图片转换成灰色小图像&#xff0c;用于存正片用的。…

Python几种字符串格式化方法

Python 字符串格式化方法 文章目录 Python 字符串格式化方法1.python中的字符串格式化--百分号 %2. 字符串格式化-数字精度控制 m.n3. 字符串格式化--快速写法 f"{变量}"4. 案例&#xff1a;股价计算小程序 1.python中的字符串格式化–百分号 % %的主要作用将数据转换…

android switch的使用

一、前言&#xff1a;很多app都有开关这个功能&#xff0c;开关控件的使用跟checkbox好像也差不多。 二、上代码 创建一个activity:SwitchDefaultActivity public class SwitchDefaultActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListene…

vue(脚手架创建)代理解决跨域问题

目录 为什么会出现跨域问题 什么是跨域 Vue CLI Vue2解决跨域问题 不重写路径 重写路径 vue.config.js代码 Vue3解决跨域问题 ViteVue解决跨域问题 vite.config.ts代码 总结 为什么会出现跨域问题 出于浏览器的同源策略的限制。同源策略是一种约定&#xff0c;它是…