当前位置: 首页 > news >正文

案例实践|运营腾讯游戏,Proxima Beta 使用 Apache Pulsar 升级团队协作与数据治理...

文章摘要

本文整理自 Pulsar Summit Asia 2022 上,Proxima Beta 软件工程师施磊的分享《How to achieve better team integration and data governance by using Apache Pulsar》。本文首先将为大家介绍 CQRS 和 Event Sourcing 概念,便于了解为何 Proxima Beta 使用 CQRS 和 Event Sourcing 来设计系统,然后说明 Apache Pulsar 在此类架构中的独特优势,尤其针对组织架构较为复杂和数据监管严格的场景。本文将介绍 Proxima Beta 如何使用 Apache Pulsar 云原生中间件来加强团队协作,并分享提升数据治理透明度的经验。

背景简介

Proxima Beta 属于 Tencent IEG Global,主要负责腾讯游戏的海外运行业务。Proxima Beta Security Service 团队负责应对腾讯游戏运营过程中的各类风险事件,如检测作弊活动和过滤有害内容检测等。

CQRS 与 Event Sourcing

我们在介绍 CQRS 和 Event Sourcing 之前,先介绍一下 CRUD。

8a88b7c35ad86e25574991a2406e6d74.png

上图是一个典型的 CRUD 增删改查系统的架构。这类系统是存储系统为中心构建,其存储系统一般为某种关系数据库,或简单的 KV 存储和对象存储。这一架构的关键在于系统保存了所有对象,即系统的状态,很多时候只保存了当前的状态。在存储系统上会构建包含各种请求响应逻辑的应用服务器(Application Server)。实践中应用服务器与客户端之间还可能有接入层、网关等结构,存储与应用服务器之间可能有缓存等结构。此示意图的结构较为简单,主要为了展示 CRUD 的系统架构框架。

应用服务器负责定义各种业务逻辑并屏蔽底层存储系统细节。这种架构非常流行,有大量工具围绕其开发以提升开发效率。构建新系统时通常使用该架构作为默认架构。其特点有:

  • • 简单直接;

  • • 客户端向有应用定义的接口对齐,应用接口又由开发者设计,而开发者来自多个功能团队,会存在协作问题;

  • • 这种架构面向状态,其存储系统会显式定义系统当前的状态,但很难从存储表结构中得知状态将会如何改变,因为状态改变的动作分散在应用的代码库(Code Base)中。

存在多个功能团队时,该架构会带来很多挑战:

  • • 客户端需要同各个团队逐个对接,过程较为繁琐;

  • • 由于不同团队内部的设计不同、关注的问题不同,客户端侧可能需要同一时间请求不同的数据,或者在不同时刻请求相同数据,甚至两者皆有,大大影响组织效率。

851fb15d12e582502d44bee5f1ff7310.png

为解决上述问题引入了 CQRS(命令查询职责分离)理念。这里的重点在于每个方法不能既是命令又是查询。将查询比作向系统提问的话,那么在提问时不可以改变问题的答案即命令。CQRS 要求系统在接口上将所有对象严格分为两种类型,即命令和查询。CQRS 还要求读写操作背后的数据模型严格区分开,系统被分割为写入侧与读取侧,两侧各有专用的数据模型。CQRS 的写操作以异步的方式应用于读取侧的视图中,让写入侧发起的状态变更被读取侧观察到。

Event Sourcing 的核心思想是将变化(动作)用事件表达出来,将动作应用到事件模型上的顺序保存成一系列仅追加(不可变更)的日志事件流。相对典型的增删改查系统只保持最后一次变更的当前状态,Event Sourcing 则会记录所有历史动作。这样就可以从事件流中重建所有描述系统的潜在模型。银行对账单就是 Event Sourcing 理念在现实中的应用案例。总体来说,Event Sourcing 是面向变化的系统。

CQRS 与 Event Sourcing 结合有哪些好处

c9f7fed4ff4ece74bbf3245ed3803dc0.png

Event Sourcing 与 CQRS 结合有很多好处。

  1. 1. CQRS 并没有定义写入侧存储模型,如果和 Event Sourcing 结合,开发时写入侧的事件模型就已经定义好了,不需要额外的操作,也就是说 Event Sourcing 可以直接嵌入到 CQRS 的写入侧。

  2. 2. CQRS 读取侧的物化视图靠写入侧的事件驱动,维护当前状态的责任转移到了事件处理程序中。不同的事件处理器在同组事件流上能够以不同的方式维护自己关心的状态,得出不同的结果,可以很好地解决多个功能团队带来的冲突。不同的功能团队可以按自己的需求订阅消费客户端侧生成的事件,维护自己的物化视图,再有客户端侧使用对应的 API 查询对应的状态,满足业务需求。

12b5cc1365421a43d85d2e28f353fd65.png

上图右侧是线上游戏“幻塔”中的截图。该 UI 供玩家举报其他玩家的违规行为。表单中的举报理由可以用事件来表示,不同理由记录为不同字段,各个功能团队可以订阅该事件,配置自己的过滤规则来找出自己需要处理的举报,这样有利于团队协作集成。CQRS 与 Event Sourcing 的结合使不同团队可以同时处理同一组数据,得到各自需要的结果。这种结合还让不同的功能团队更多关注自己领域的问题,无需考虑自己定义的接口是否对客户友好,是否与其他团队的接口良好集成。

在 CQRS 与 Event Sourcing 结合的系统中,产品团队可以用自己最合适的方式生成事件,功能团队来消费同一组事件。不同的团队可以依照各自的职能和专业,提取需要的信息和结果,供产品团队查询来满足业务需求。

为什么使用 Apache Pulsar

多租户与负载隔离

d9e2433c91a13cf597179bd45ccc8783.png

Apache Pulsar 的多租户与负载隔离是原生支持、开箱即用的功能。多租户方便组织中多个团队共享单个实例。Pulsar 提供了租户、命名空间与 Topic 三个级别的隔离。租户一般用于实现部门间的负载隔离,命名空间可用于部门内按照不同负载类型进行隔离。

跨地域复制

f2417ad1227feaef9f1b947b23886736.png

Pulsar 的跨地域复制功能可用于在不同的数据中心之间为消费者和生产者提供一致的事件流视图,常用于容灾、数据监管、流量调配场景。

Proxima Beta 使用了多集群系统。多集群系统一般用于满足组织的容灾要求,如 RTO 和 RPO 指标。多集群系统也用于满足用户对更低延迟的需求,并可用于满足监管需求。

ca3e9ed88e9ebf98af124a209204e327.png

常见的多集群系统部署方式是将独立的集群复制到不同的区域,集群之间无法自动化协同。这样会造成集群成本和开销随着集群数量增加而快速上涨。但这种方式最容易满足合规方面的最高要求。

dc492a4e2961cf6dd71bb4c3b3070be0.png

另一种方式是将跨集群通讯的复杂度推到应用层解决,应用层可以协调其他集群的实例。如果组织只有少量应用,这种方式的成本较低,配置文件只需配置一次即可。但多数组织会有很多应用,这种方式就不太现实。

31d401ecf49d6f0a641160a23a3af7cc.png

Proxima Beta 采用的方式叫做 Global Data Ring(全局数据环),这是技术与规章的组合实现。首先,所有应用程序只能与本地端点通讯,该规则无需应用开发者自己配置,保证了应用程序不会有意外的跨地域通讯能力。需要跨地域同步写入时,全局数据环引入了全局命名空间(Global Namespace)作为配置方法。全局命名空间激活了跨地域复制,并将目标设置为所有区。这样该命名空间的写入可以被所有区域看到。

与全局命名空间相对的是区域命名空间(Regional Namespace),该命名空间禁用跨地域复制,其数据只能被与生产者同区域的消费者消费。这种命名空间主要用于处理玩家数据,以满足合规要求。还有一种是跨地域域命名空间(Cross-region Namespace),其同样激活了跨地域复制,但目标是限定为少数几个区。该设计可用于某些监管较松的区域。

这样的设计降低了数据流转的成本,也让应用开发者无需考虑数据流转、数据监管规定、底层基础设施差异等问题。底层基础设施的差异都被 Pulsar 与 CRDB 屏蔽了。开发者只需写入对应的命名空间,从对应的命名空间消费即可。

总结

我建议大家根据系统现有的查询构建物化视图,更好地理解系统在读取侧的行为预期。之后,可以再去了解客户的系统,研究客户系统可以生成哪些事件,哪些事件与自己有关。在此过程中你会了解自己的系统写入侧的事件模型,然后开发事件处理程序,由写入侧的事件驱动来更新读取侧的物化视图。

如果你的组织也允许覆盖全球的业务,需要考虑不同的监管要求,可以尝试利用 Pulsar 的命名空间隔离能力构建虚拟的地理围栏,提升数据治理的透明度,更好地服务于全球业务。

作者简介

施磊,Proxima Beta 首席软件工程师,就职于 Proxima Beta Security Service。本文由 StreamNative 协助整理发布。


关注「Apache Pulsar」,获取干货与动态

👇🏻加入 Apache Pulsar 中文交流群👇🏻

bc81f5c8c684c7e183e2e5b31025f05e.jpeg

相关文章:

案例实践|运营腾讯游戏,Proxima Beta 使用 Apache Pulsar 升级团队协作与数据治理...

文章摘要本文整理自 Pulsar Summit Asia 2022 上,Proxima Beta 软件工程师施磊的分享《How to achieve better team integration and data governance by using Apache Pulsar》。本文首先将为大家介绍 CQRS 和 Event Sourcing 概念,便于了解为何 Proxim…...

Hudi的7种索引

1、Bloom Index Bloom Index (default) 使用根据记录键构建的bloom过滤器,也可以使用记录键范围修剪候选文件.原理为计算RecordKey的hash值然后将其存储到bitmap中,为避免hash冲突一般选择计算3次 HoodieKey 主键信息:主要包含recordKey 和p…...

Linux内核(十三)系统软中断 software

文章目录中断概述Linux内核中断软中断相关代码解析软中断结构体软中断类型软中断两种触发方式函数__do_softirq解析定时器的软中断实现解析定时器相关代码总结Linux版本:linux-3.18.24.x 中断概述 中断要求     快进快出,提高执行效率,…...

Linux -- 查看进程 PS 命令 详解

我们上篇介绍了, Linux 中的进程等概念,那么,在Linux 中如何查看进程呢 ??我们常用到的有两个命令, PS 和 top 两个命令,今天先来介绍下 PS 命令~!PS 命令 :作用 &#x…...

C2科一考试道路通行规定

目录 低能见度等恶劣环境下的通行规定 驾驶机动车禁止行为 停车规定 通行常识 高速公路限速规定 三观不一样的人,无论重来多少次,结果都一样 他不会懂你的委屈 只是觉得自已没错 两个人真正的可悲连吵架都不在一个点上 有句话说得好 我要是没点自我…...

进程概念(详细版)

进程的概念本文主要介绍进程的相关知识 文章目录认识冯诺依曼体系结构操作系统的基本概念操作系统的作用是什么系统调用和库函数相关概念进程基本概念描述进程进程控制块(PCB)task_struct 结构体进程是如何被操作系统管理起来的先描述再组织描述好,组织好&#xff0…...

学习大数据应该掌握哪些技能

想要了解大数据开发需要掌握哪些技术,不妨先一起来了解一下大数据开发到底是做什么的~ 1、什么是大数据? 关于大数据的解释,比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模…...

【spring】Spring Data --Spring Data JPA

Spring Data 的委托是为数据访问提供熟悉且符合 Spring 的编程模型,同时仍保留着相关数据存储的特​​殊特征。 它使使用数据访问技术、关系和非关系数据库、map-reduce 框架和基于云的数据服务变得容易。这是一个伞形项目,其中包含许多特定于给定数据库…...

mysql数据库之视图

视图(view)是一种虚拟的存在,视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图之保存了查询的sql逻辑,不保存查询结…...

数据库事务详解

概述事务就是数据库为了保证数据的原子性,持久性,隔离性,一致性而提供的一套机制, 在同一事务中, 如果有多条sql执行, 事务可以确保执行的可靠性.数据库事务的四大特性一般来说, 事务是必须满足 4 个条件(ACID):原子性(Atomicity&…...

Nessus: 漏洞扫描器-网络取证工具

Nessue 要理解网络漏洞攻击,应该理解攻击者不是单独攻击,而是组合攻击。因此,本文介绍了关于Nessus历史的研究,它是什么以及它如何与插件一起工作。研究了Nessus的特点,使其成为网络取证中非常推荐的网络漏洞扫描工具…...

操作系统实战45讲之现代计算机组成

我以前觉得计算机理论不让我感兴趣,而比较喜欢实践,即敲代码,现在才发现理论学好了,实践才能有可能更顺利,更重要的是理论与实践相结合。 在现代,几乎所有的计算机都是遵循冯诺依曼体系结构,而遵…...

Simple Baselines for Image Restoration

Abstract.尽管近年来在图像恢复领域取得了长足的进步,但SOTA方法的系统复杂性也在不断增加,这可能会阻碍对方法的分析和比较。在本文中,我们提出了一个简单的基线,超过了SOTA方法,是计算效率。为了进一步简化基线&…...

Python数据可视化:局部整体图表可视化(基础篇—6)

目录 1、饼图 2、圆环图 3、马赛克图 4、华夫饼图 5、块状/点状柱形图 在学习本篇博文之前请先看一看之前发过的关联知识:...

CSDN新星计划新玩法、年度勋章挑战赛开启

文章目录🌟 写在前面🌟 逐步亮相的活动🌟 勋章挑战赛🌟 新星计划🌟 有付费课程才可参与?🌟 成就铭牌🌟 博客跟社区的关系🌟 写在最后🌟 写在前面 哈喽&#…...

Docker之部署Mysql

通过docker对Mysql进行部署。 如果没有部署过docker,看我之前写的目录拉取镜像运行容器开放端口拉取镜像 前往dockerHub官网地址,搜索mysql。 找到要拉取的镜像版本,在tag下找到版本。 拉取mysql镜像,不指定版本数&#xff0c…...

基于C/C++获取电脑网卡的IP地址信息

目录 前言 一、网卡是什么? 二、实现访问网卡信息 1.引入库及相关的头文件 2.操作网卡数据 3. 完整代码实现 4.结果验证 总结 前言 简单示例如何在windows下使用c/c代码实现 ipconfig/all 指令 提示:以下是本篇文章正文内容,下面案例可供参考…...

28相似矩阵和若尔当标准型

一、关于正定矩阵的一些补充 在此之前,先讲一下对称矩阵中那些特征值为正数的矩阵,这样特殊的矩阵称为正定矩阵。其更加学术的定义是: SSS 是一个正定矩阵,如果对于每一个非零向量xxx,xTSx>0x^TSx>0xTSx>0 正…...

springboot操作MongoDB

启动类及配置import com.mongodb.client.MongoClient;import com.mongodb.client.MongoClients;import com.mongodb.client.internal.MongoClientImpl;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplicatio…...

1月奶粉电商销售数据榜单:销售额约20亿,高端化趋势明显

鲸参谋电商数据监测的2023年1月份京东平台“奶粉”品类销售数据榜单出炉! 根据鲸参谋数据显示,1月份京东平台上奶粉的销量约675万件,销售额约20亿元,环比均下降19%左右。与去年相比,整体也下滑了近34%。可以看出&#…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

windows系统MySQL安装文档

概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

JDK 17 序列化是怎么回事

如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...