案例实践|运营腾讯游戏,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。

上图是一个典型的 CRUD 增删改查系统的架构。这类系统是存储系统为中心构建,其存储系统一般为某种关系数据库,或简单的 KV 存储和对象存储。这一架构的关键在于系统保存了所有对象,即系统的状态,很多时候只保存了当前的状态。在存储系统上会构建包含各种请求响应逻辑的应用服务器(Application Server)。实践中应用服务器与客户端之间还可能有接入层、网关等结构,存储与应用服务器之间可能有缓存等结构。此示意图的结构较为简单,主要为了展示 CRUD 的系统架构框架。
应用服务器负责定义各种业务逻辑并屏蔽底层存储系统细节。这种架构非常流行,有大量工具围绕其开发以提升开发效率。构建新系统时通常使用该架构作为默认架构。其特点有:
• 简单直接;
• 客户端向有应用定义的接口对齐,应用接口又由开发者设计,而开发者来自多个功能团队,会存在协作问题;
• 这种架构面向状态,其存储系统会显式定义系统当前的状态,但很难从存储表结构中得知状态将会如何改变,因为状态改变的动作分散在应用的代码库(Code Base)中。
存在多个功能团队时,该架构会带来很多挑战:
• 客户端需要同各个团队逐个对接,过程较为繁琐;
• 由于不同团队内部的设计不同、关注的问题不同,客户端侧可能需要同一时间请求不同的数据,或者在不同时刻请求相同数据,甚至两者皆有,大大影响组织效率。

为解决上述问题引入了 CQRS(命令查询职责分离)理念。这里的重点在于每个方法不能既是命令又是查询。将查询比作向系统提问的话,那么在提问时不可以改变问题的答案即命令。CQRS 要求系统在接口上将所有对象严格分为两种类型,即命令和查询。CQRS 还要求读写操作背后的数据模型严格区分开,系统被分割为写入侧与读取侧,两侧各有专用的数据模型。CQRS 的写操作以异步的方式应用于读取侧的视图中,让写入侧发起的状态变更被读取侧观察到。
Event Sourcing 的核心思想是将变化(动作)用事件表达出来,将动作应用到事件模型上的顺序保存成一系列仅追加(不可变更)的日志事件流。相对典型的增删改查系统只保持最后一次变更的当前状态,Event Sourcing 则会记录所有历史动作。这样就可以从事件流中重建所有描述系统的潜在模型。银行对账单就是 Event Sourcing 理念在现实中的应用案例。总体来说,Event Sourcing 是面向变化的系统。
CQRS 与 Event Sourcing 结合有哪些好处

Event Sourcing 与 CQRS 结合有很多好处。
1. CQRS 并没有定义写入侧存储模型,如果和 Event Sourcing 结合,开发时写入侧的事件模型就已经定义好了,不需要额外的操作,也就是说 Event Sourcing 可以直接嵌入到 CQRS 的写入侧。
2. CQRS 读取侧的物化视图靠写入侧的事件驱动,维护当前状态的责任转移到了事件处理程序中。不同的事件处理器在同组事件流上能够以不同的方式维护自己关心的状态,得出不同的结果,可以很好地解决多个功能团队带来的冲突。不同的功能团队可以按自己的需求订阅消费客户端侧生成的事件,维护自己的物化视图,再有客户端侧使用对应的 API 查询对应的状态,满足业务需求。

上图右侧是线上游戏“幻塔”中的截图。该 UI 供玩家举报其他玩家的违规行为。表单中的举报理由可以用事件来表示,不同理由记录为不同字段,各个功能团队可以订阅该事件,配置自己的过滤规则来找出自己需要处理的举报,这样有利于团队协作集成。CQRS 与 Event Sourcing 的结合使不同团队可以同时处理同一组数据,得到各自需要的结果。这种结合还让不同的功能团队更多关注自己领域的问题,无需考虑自己定义的接口是否对客户友好,是否与其他团队的接口良好集成。
在 CQRS 与 Event Sourcing 结合的系统中,产品团队可以用自己最合适的方式生成事件,功能团队来消费同一组事件。不同的团队可以依照各自的职能和专业,提取需要的信息和结果,供产品团队查询来满足业务需求。
为什么使用 Apache Pulsar
多租户与负载隔离

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

Pulsar 的跨地域复制功能可用于在不同的数据中心之间为消费者和生产者提供一致的事件流视图,常用于容灾、数据监管、流量调配场景。
Proxima Beta 使用了多集群系统。多集群系统一般用于满足组织的容灾要求,如 RTO 和 RPO 指标。多集群系统也用于满足用户对更低延迟的需求,并可用于满足监管需求。

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

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

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 中文交流群👇🏻

相关文章:
案例实践|运营腾讯游戏,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 结构体进程是如何被操作系统管理起来的先描述再组织描述好,组织好࿰…...
学习大数据应该掌握哪些技能
想要了解大数据开发需要掌握哪些技术,不妨先一起来了解一下大数据开发到底是做什么的~ 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镜像,不指定版本数,…...
基于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%。可以看出&#…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
