当前位置: 首页 > 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%。可以看出&#…...

跨境数据传输是日常业务中经常且至关重要的组成部分

跨境数据传输是日常业务中经常且至关重要的组成部分。在过去的20年中,由于全球通信网络和业务流程的发展,全球数据流的模式已迅速发展。随着数据从数据中心移到数据中心和/或跨边界移动,安全漏洞已成为切实的风险。有可能违反国家和国际数据传…...

错误: tensorflow.python.framework.errors_impl.OutOfRangeError的解决方案

近日,在使用CascadeRCNN完成目标检测任务时,我在使用这个模型训练自己的数据集时出现了如下错误: tensorflow.python.framework.errors_impl.OutOfRangeError: PaddingFIFOQueue _1_get_batch/batch/padding_fifo_queue is closed and has in…...

springboot项目初始化执行sql

Sprint Boot应用可以在启动的时候自动执行项目根路径下的SQL脚本文件。我们需要先将sql脚本写好,并将这些静态资源都放置在src/main/resources文件夹下。 再配置application.yml: spring.datasource.initialization-mode 必须配置初始化模式initializa…...

Kubernetes之存储管理(中)

NFS网络存储 emptyDir和hostPath存储,都仅仅是把数据存储在pod所在的节点上,并没有同步到其他节点,如果pod出现问题,通过deployment会产生一个新的pod,如果新的pod不在之前的节点,则会出现问题&#xff0c…...

MySQL workbench的基本操作

1. 创建新的连接 hostname主机名输入“local host”和“127.0.0.1”效果是一样的,指的是本地的服务器。 需要注意的是,此处的密码在安装软件的时候已经设定。 点击【Test Connection】,测试连接是否成功。 创建完的连接可以通过&#xff0c…...

【Flink】FlinkSQL中Table和DataStream互转

在我们实际使用Flink的时候会面临很多复杂的需求,很可能需要FlinkSQL和DataStream互相转换的情况,这就需要我们熟练掌握Table和DataStream互转,本篇博客给出详细代码以及执行结果,可直接使用,通过例子可学会Table和DataStream互转,具体步骤如下: maven如下<?xml ver…...

网络总结知识点(网络工程师必备)一

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 1.TCP UDP协议的区别 2.ARP是第几层协议,其作用...

离线安装samba与配置(.tar方式安装)

一、samba离线安装【安装并设置成功后&#xff0c;相关文件及其位置&#xff1a;①smbd&#xff1a;/usr/local/samba/sbin/smbd②nmdb&#xff1a;/usr/local/samba/sbin/nmbd③配置文件 smb.conf&#xff1a;/usr/local/samba/lib/smb.conf④添加用户的 smbpasswd 文件&#…...

[Java基础]—JDBC

前言 其实学Mybatis前就该学了&#xff0c;但是寻思目前主流框架都是用mybatis和mybatis-plus就没再去看&#xff0c;结果在代码审计中遇到了很多cms是使用jdbc的因此还是再学一下吧。 第一个JDBC程序 sql文件 INSERT INTO users(id, NAME, PASSWORD, email, birthday) VAL…...

基本面向对象编程-计算机基本功能实现_

《C/S项目实训》实验报告 实验名称&#xff1a; 基本面向对象编程-计算机基本功能实现_ 一、实验目的 通过综合实践项目&#xff0c;理解Java 程序设计是如何体现面向对象编程基本思想&#xff0c;掌握OOP方法&#xff0c;掌握事件触发、消息响应机制。进一步巩固面向对…...

网站引入百度地图/网络推广怎么推广

一.管理输入和输出 在系统中利用普通用户执行命令’find /etc -name passwd’&#xff0c;由于普通用户权限问题&#xff0c;将会出现两种输出&#xff1a;正确输出和错误输出 因为student用户权限问题会有以下输出find: ‘/etc/pki/CA/private’: Permission denied ##没有进…...

佛山市手机网站建设/网站关键词排名

repo是个多git库的管理工具&#xff0c;由goog开发&#xff0c;国内由于上不了goog&#xff0c;所以我建议在这里下载 https://github.com/hisilicon/git-repo 这个repo只支持git>1.7.2 repo文件内部指向的REPO_URL也请更新 REPO_URL https://gerrit-googlesource.lug.ust…...

南昌营销型网站建设/2023半夜免费b站推广

Apache服务器自带了ab压力测试工具&#xff0c;可以用来测试网站性能&#xff0c;使用简单方便。 工具/原料 Apache 方法/步骤 打开Apache服务器的安装路径&#xff0c;在bin目录中有一个ab.exe的可执行程序&#xff0c;就是我们要介绍的压力测试工具。 在Windows系统的命令行下…...

自己怎么做网站啊/无人区在线观看高清1080

Linux系统平台下用Fdisk分区格式化硬盘 格式化与分区 hd--IDE设备 sd--SCSI设备 fdisk -l /dev/sda 查看第一块硬盘分区情况 fdisk /dev/sdb 给第二块硬盘分区 command acton (m for help)&#xff1a;m #显示命令列表 a-设置可引导标志&#xff1b;b-设置卷标&#xff1b; d-删…...

新昌做网站/网站的seo

原文链接&#xff1a;https://hellogis.yuque.com/docs/share/351e9e9d-831f-47bc-a7c6-871528beb8c2?# 《Arcpy》 文章目录介绍按需开发的思路系统学习使用ArcPy的方法相关文章介绍 Arcpy是ArcGIS给出的一种地理处理处理方式&#xff0c;用Python实现 在ArcGIS体系中&#…...

网站建设全程揭秘/黑科技引流推广神器

$(".selectL li a.sbg").attr("class",function(index,oclass){}),其中index是当前对象在获得的对象集合中的索引&#xff0c;oclass是当前对象原来的class属性值 window.parent.frames["topFrame"].location.reload(); 是在frameset集合里&…...