腾讯互娱开源分布式开发框架Pebble
构建游戏世界的Pebble
愿景:出色的游戏服务器端底层框架
现代游戏项目中,为了让更多的玩家能在一起玩,游戏服务器所需要承载的在线玩家数量越来越多。同时为了让游戏更好玩,越来越多复杂的业务逻辑都需要放在游戏服务器端上运行。因此,拥有一个同时具备可灵活扩展功能、并且能轻松构建服务器集群的底层框架,变得越来越有必要。这样游戏程序员可以专心编写好玩的游戏逻辑,而无需去担心服务器承载量的问题。
Pebble的含义是“基石”。我们开发这个框架的目标,就是希望它能坚固、可靠,发挥作为基础开发框架的作用,成为游戏服务器的基础代码。Pebble诞生于腾讯公司的游戏研发部公共技术研发中心,这个中心已经为腾讯游戏提供了多年的底层技术和服务支持。从端游、页游到手游、电视游戏,这个团队都一直走在游戏研发技术的前列。Pebble这个产品,正是他们多年游戏研发技术的积累和游戏支持经验的结晶。
价值观:易用、灵活、云
Pebble在设计之初,着眼点有三个:易用性;灵活性;云特性。为了让更多的游戏开发团队能很容易的搭建起一个游戏服务器端,Pebble仔细的衡量各种特性,简化出一套游戏服务器端的最常用范围里功能库,并且让这套代码仅依靠Linux系统,就可以运行起来。同时,Pebble库本身也是一个分层良好的SDK,开发团队既可以使用Pebble的完整功能,快速开发出一个游戏服务器;也可以只抽取其有特色的底层库,用于增强自己的游戏服务器程序。Pebble为了让游戏服务器真正的成为一个PaaS云,还在代码库中预制了完整的集群管理方案,可以很方便的在任何的IaaS云服务器上,搭建游戏服务器。并且,Pebble还能完美的结合腾讯云的“游戏云”方案,使任何游戏服务器都能一键上云,省却所有的安装、部署、资源规划过程,享受完整的统计、监控服务。
业务特性
运行环境:
Pebble在Linux系统下运行,以C++静态库 + 头文件的形式发布;
客户端引擎支持:Unity3D(C#库)、 Cocos2d-x(C++库);
Pebble提供了模板项目工程目录,以及 代替传统的make的“blade”编译工具。(这款工具简化了以往编写Makefile的繁琐过程。但你还是可以使用make或者其他任何编译工具来构建使用Pebble的工程,因为静态库文件和头文件都是标准的。)
通信功能
Pebble支持“客户端-服务器”以及“服务器-服务器”通信。用户可以使用Pebble提供的库很简单的实现手机客户端对Linux服务器进程的通信;同时Linux服务器进程之间,也可以用Pebble库简单实现通信功能。Pebble本身可以同时支持多种传输协议和编码协议,包括TCP和HTTP用于传输,Binary和JSON用于编码,用户也可以自定义扩展支持的协议。
通信功能的接口以RPC形式提供:由用户编写一个函数IDL文件[~和facebook著名开源软件Thrift格式一样],定义一个函数以及函数的参数,Pebble负责对这个函数构建底层通信代码。用户只需要调用自动生成的函数“桩代码”,远程的“骨架代码”函数就会被自动调用,而返回值也会自动回传给调用方。用户只需要填写函数“骨架代码”的模板空缺,就能实现自己需要的功能。
Pebble的RPC除了标准的“请求-响应”模型,还支持“单向RPC”,简单来说,就是无需等待返回值的RPC,这在游戏中的一些“通知、同步”场景中很实用,能节省不少延迟。另外,Pebble还支持广播通信的能力:用户只需要在手机端(服务器端也可),注册一个“反向RPC”骨架函数,作为接受通知的处理函数,就能从Linux服务器上,向任意数量和组合的终端(包括手机及服务器)广播数据。需要广播的目标,是用Pebble提供的API进行分频道管理。这些频道数据在整个集群中是自动共享的,因此,你可以使用整个Pebble服务器集群来实现广播功能,而不需要让手机客户端都同时连接到某个特定的服务器上来做广播。
异步框架和协程
Pebble本身是一个异步单进程框架,能提供非常高的处理吞吐量,同时也能大大简化复杂业务逻辑中的并发数据共用问题。因此用户在使用Pebble的时候,也推荐使用异步的方式来开发业务逻辑。Pebble自身为了支持异步的开发模式,提供了启动、重载数据、停止服务等几个常用信号的处理接口,并且也提供了定时器API供业务使用。
虽然异步代码有性能上的优势,但是代码的可读性却往往比同步代码要差,因为一个完整的业务流程,可能被切分到多个不同的异步回调代码中,在阅读代码的时候难以有一个完整的流程印象。所以Pebble引入了协程的能力:用户的每个RPC处理,都会自动建立一个协程。也就是说,用户可以在编写RPC的“骨架代码”内容时,随时使用Yiled()语句切换出去,然后在异步处理完成后用Resume()切换回来。这样,一个需要经过多次异步处理的业务逻辑,就可以在同一段函数中完整记录。除了可以在RPC中使用协程外,定时器的回调函数也会建立一个单独的协程供业务代码使用。
Pebble所提供的IDL,并不仅仅是一个用于生成RPC代码的描述语言,它还可以让用户以“注解”的方式扩展它的功能。用户可以只有定义一个对象的各种特性和配置项,以“注解”的语法写入IDL中,然后这些特有的逻辑,会在“注解”的语法框架下,回调用户自定义的一些代码,从而产生千变万化的能力。比如你可以用注解功能来实现一些特殊的初始化,或者回写数据对象到特定的存储设备等等……
Pebble框架如同一般框架,还提供了一些实用的杂项功能:从INI文件中读取配置,用命令行参数或系统变量覆盖这些配置;提供实用的日子配置和打印功能;设置进程版本号等……
数据缓存和持久化
游戏业务开发的其中一个特点,就是有大量复杂的业务数据结构。这些数据结构在游戏开发和运营的过程中,往往会需要持续的修改。同时,这些数据结构中的数据,一般都需要在客户端、服务器端之间传送,然后在服务端缓存并处理,最后回写(持久化)到数据库里。Pebble为了让这个过程变得简单,提供了一整套的功能API,让用户可以一次性完整的解决通信、缓存、持久化的问题。
Pebble提供了一个类似std::map的接口,让用户定义的数据结构,可以用put/get的方式放入一个对象池中缓冲。这个对象池是在整个集群中共享的,也就是说任何一个进程put放入一个对象,其他的进程都能get获得此对象。
为了提高性能,Pebble的对象缓存池是具备“本地缓存”能力的,也就是说,如果你持续在一个进程来put/get某个对象,这个对象实际上是在本地机器的内存中缓存的,这可以让对象缓存的读写性能满足非常高的要求。而多个机器间对象的同步问题,则由Pebble在最终一致性原则下自己解决。
为了简化对象到数据库的持久化操作,Pebble提供了把对象写入MySQL数据库和Redis存储的内嵌操作。你只需要调用一个Save()函数,就完成了持久化操作;并且你还可以设置自动回写的持久化操作。对象字段和持久化设备表结构的关联,并不需要用户编写SQL代码,而是在IDL上简单的“注解”一下就可以完成。Pebble还支持把对象持久化到腾讯出品的,更强大的专业游戏存储设备tcaplus云上。最后,如果你需要支持其他的持久化存储设备,可以使用Pebble提供的持久化接口API,自己去编写存储、读取操作;也可以利用IDL的注解能力,来定义对象到持久化结构的关系,并关联执行代码。
集群特性
三种工作模式
由于Pebble是被设计用于构建大规模游戏服务器集群的,因此其自带了丰富的集群特性。同时,考虑到游戏常常在开发和测试过程中,需要快速搭建一些小型的服务器,所以Pebble也着力简化服务器的独立部署。所以Pebble设计了三种模型的集群特征:单服(standalone)、集群(cluster)、云(cloud)
单服模式:用于游戏开发和功能测试,这个模型下,游戏服务器被设计成可不依赖于任何软件、服务独立运行。只需要让你的程序编译通过,甚至连数据库都无需连接,就能直接测试。这个模式下的Pebble是具备所有完整功能特性的,所以你无需担心以后切换模式还要修改代码。在这种模式下,游戏服务器被限制为一个单独进程,你可以把整个运行文件和相关目录,拷贝到任何一个Linux系统上运行。
集群模式:Pebble框架编写的服务进程,可以非常简单的部署成一个集群。这个集群中的节点自带了负载均衡、自动容灾、动态扩容的能力。这些集群系统中最棘手的问题,你都无需编写任何代码就能都解决。你只需要简单的沿用之前在单服模式下的代码,然后修改一下启动的命令行参数(或配置文件),最后启动几个后台监控进程。
云模式:在Pebble的集群模式下,其实已经能完成大部分的海量承载的任务。但是如果你还需要更优化的使用硬件资源,就应该使用云模式。Pebble的云模式能提供你对集群中资源隔离和动态调整能力,让你最大效率的利用服务器资源。同时云服务商也提供WEB界面的完善的统计和监控系统,可以实时掌握整个服务云的运行情况。
对等网络模型:
在Pebble的集群中,包含两类进程,一类是“集群中心”进程,负责管理和存储整个集群的运行时状况,这类进程由ZooKeeper充当,无需用户开发;另外一类是“服务进程”,这些进程负责完成业务功能,这些进程由用户使用Pebble库开发编译而成。所有的“服务进程”,都遵循着最简单的协作逻辑:每个进程都是对等的,它们自己向集群中心报告自己的状态。当需求发起请求时,都先从“集群中心”处获得目标进程的具体地址,然后再发起请求。因此Pebble集群具有非常突出的优点:部署非常简单——每个进程只需要配置自己的服务端口,同时配置一个代表集群的“中心地址”。一旦配置好这两个地址,就能组建成任何规模复杂的集群。另外,由于“集群中心”的存在,你也可以从中读取到整个集群的实时状态,并使用这些信息开发出自己的集群监控管理系统。Pebble为你开发集群管理系统,提供了对应的“服务管理”的API。
基于服务路由的伸缩特性:
服务器端代码的功能,Pebble都以“服务”的概念来封装,所以服务器伸缩性,也是根据“服务”的请求目标来伸缩的。简单来说,就是Pebble的“服务”可以在多个服务器上运行,而这些服务器增加和缩减,都不影响“服务”的提供。基本的实现方法,就是由于Pebble集群会对服务请求做路由选择:选择那些可用的、符合业务预订规则的集群节点(服务器)来响应请求。这个过程完全是自动的,你可以kill掉任何一个Pebble集群中的服务进程,服务请求就不会发给这个失效的进程;你可以简单的启动一个Pebble服务进程,它将自动加入你想要的集群,然后很快服务请求就会发给这个新加入的进程。另外,在多个服务节点的选择上,如果业务功能是有一些特定要求的,比如按某个数值做哈希,Pebble也可以支持,只需要在服务请求的时候,把需要哈希的数值送入请求API即可。这大大简化了以往需要同步在线服务节点状态,然后计算具体业务路由规则,最后才请求服务的繁琐过程。
状态无关的服务
在服务器集群中,最难处理的伸缩性和容灾问题,就是对有状态的服务节点进行操作。由于状态数据有可能在伸缩和容灾中丢失,所以就牵涉大量的同步、落地、缓存管理的代码。这些代码在大量的服务集群中被反复开发,导致了大量的人力浪费。Pebble对于服务状态数据的解决方案是“让服务进程尽量的状态无关”。Pebble为集群服务进程,提供了一个标准的状态存储接口,让用户把状态数据托管给Pebble,这样用户就无需自己去维持复杂的状态有效性和伸缩性了。这个托管的状态数据接口非常易用,就是一个stl的map接口,只不过这个map是一个分布式存储的map,它会在调用者本地建立内存缓存(可用共享内存),然后在数据需要修改、冷却等情况下自动落地(持久化)到存储设备中;在多个服务节点共用一条记录的时候,自动完成数据同步的功能。Pebble可以提供数据在最终一致性、弱一致性、强一致性之间的配置和切换,从而提供不同的性能输出。
升云之力
腾讯云:分布式计算平台
Pebble是一个具备建立PaaS云能力的服务框架。因此我们在腾讯云的基础IaaS上,搭建了一个可以承载Pebble集群的分布式计算平台。这个平台可以提供Pebble集群的服务部署、资源采购和隔离、统计监控、自动容灾、智能伸缩等能力。简单来说,就是你可以仅仅上传你的Pebble服务代码,然后所有的容量设计、硬件采购、部署、监控,都由腾讯云的分布式计算平台来完成。几乎所有的技术运维操作,包括扩容缩容、故障恢复、负载均衡都不需要使用者去处理,但是你还是可以很细致的监控到这些事件和效果,也可以介入调整这些自动化的策略。
运维监控WEB工具及日志服务
作为一款云服务的框架,对于运维操作和状态监控是必然非常重视的。Pebble由于是服务框架,所以它能收集到非常细节的信息,包括每个服务的调用成功率、时延、依赖路径树等等。它还可以根据这些动态统计的细节信息,提供详细的异常报警策略。对于运行中的故障排查,也能提供详细的记录和现场信息。这一切的操作,在腾讯云上,都是有漂亮的WEB界面呈现;同时也提供丰富的RESTful管理接口,可以让用户自己定制专用的运维工具。除了运行状态信息监控外,Pebble本身提供的日志框架,可以对接到腾讯云的游戏分布式日志统计平台上,这个统计平台可以利用大量服务器并行计算,为你从大量的日志中统计、挖掘出一切你想要的信息。
自动化弹性伸缩
作为分布式服务集群,其运维工作一般是非常繁重的。成千上万的服务器同时运行,硬件、网络故障很常见;业务的用户量大幅波动,资源采购回收工作量也很大;产品内容日新月异,更新版本,部署新的运行环境也很频繁——这一切都需要专业的运维团队来操作。但是,如果你使用Pebble框架,然后在腾讯云的分布式计算平台上运营,以上这些复杂的工作,就都会由经验丰富的腾讯云团队和自动化程序来承担。你所需要做的事情,仅仅是上传一次你的程序,然后开通一下服务就行了。在业务访问量小的时候,分布式计算平台会分配较少的资源来运行,以便帮你节省费用;当业务访问量快速增长的时候,平台会自动的分配充足的资源来接纳新的请求量,这个扩容的过程是完全自动完成的;如果你的业务量回落,平台也会智能的降低运行资源,减少你的开销——这就是自动化的弹性伸缩云能力。
Pebble框架腾讯互动娱乐事业群(IEG)研发部,在多年支持腾讯游戏经验积累下,开发的一款通用型游戏服务器端开发框架。此框架的使用非常容易学习,可以在几乎无依赖的环境下,满足所有常见的游戏服务器端基础功能;同时也具备无须修改业务逻辑代码,就可以建立起海量承载的分布式集群;最后,这个框架还能配合腾讯云的分布式计算平台,提供自动化运维、丰富运维监控和日志统计、资源智能弹性伸缩的能力。
本项目开源地址:https://github.com/tencent/pebble
腾讯互娱开源分布式开发框架Pebble的更多相关文章
- 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经
转自:http://www.itmian4.com/forum.php?mod=viewthread&tid=3985 首先感谢师兄在两年前发的贴([天道酬勤] 腾讯.百度.网易游戏.华为Of ...
- 分布式开发框架Pebble使用说明
简介 Pebble定位为一个好用.可靠.高性能.易扩展的分布式开发框架,支持多种使用方式: 使用完整的pebble框架 独立使用各pebble子模块 在其他框架中嵌入pebble框架. Pebble具 ...
- 腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……
腾讯QQ团队将于12月4日开源一个服务开发运营框架,叫做毫秒服务引擎(Mass Service Engine in Cluster,MSEC),它集RPC.名字发现服务.负载均衡.业务监控.灰度发布. ...
- 国产开源数据库:腾讯云TBase在分布式HTAP领域的探索与实践
导语 | TBase 是腾讯TEG数据平台团队在开源 PostgreSQL 的基础上研发的企业级分布式 HTAP 数据库系统,可在同一数据库集群中同时为客户提供强一致高并发的分布式在线事务能力以及高 ...
- 大众点评开源分布式监控平台 CAT 深度剖析
一.CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解.CAT不仅增强了CAL系统核心模型,还添加了更丰富的报 ...
- .NET开源快速开发框架Colder发布 (NET452+AdminLTE版)
.NET开源快速开发框架Colder(NET452+AdminLTE版) 引言 半年前将基于Easyui的快速开发框架开源,三个版本(NET4.52,NETCore和NET4.0)总共荣获200+星, ...
- 【转载】.NET开源快速开发框架Colder(NET452+AdminLTE版)
.NET开源快速开发框架Colder(NET452+AdminLTE版) 简介 本框架旨在为.NET开发人员提供一个Web后台快速开发框架,采用本框架,能够极大的提高项目开发效率. 本版本框架采后端采 ...
- 宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程
一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背 ...
- 2019 三七互娱java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.三七互娱等公司offer,岗位是Java后端开发,因为发展原因最终选择去了三七互娱,入职一年时间了,也成为了面 ...
随机推荐
- IDEA使用Git管理项目
今天将项目使用Git管理了,IDEA. 第一步: 第二步:
- Codeforces Round #390 (Div. 2) C. Vladik and chat(dp)
http://codeforces.com/contest/754/problem/C C. Vladik and chat time limit per test 2 seconds memory ...
- TCGA系列--GDCRNATools
https://github.com/Jialab-UCR/GDCRNATools GDCRNATools - An R package for downloading, organizing, an ...
- Java中含有静态成员的的初始化顺序
class Bowl{ Bowl(int marker){ System.out.println("Bowl(" + marker + ")" ); } voi ...
- 【 Python】模块学习之Flask模板引擎:jinja2
原文链接:https://www.cnblogs.com/dachenzi/p/8242713.html 模板的概念 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛 ...
- jquery性能优化的十种方法
jquery性能优化的十种方法 有时候我们在书写jquery的时候,为了书写代码方便,往往忽略了程序执行过程中,给客户端带来的压力.随之而来的就是在某些低端浏览器或者低端电脑上运行速度缓慢,甚至无法运 ...
- 055——VUE中vue-router之路由参数的随意设置与伪静态链接地址处理:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- VERSIONINFO Resource
转自(http://www.xuebuyuan.com/1202062.html) VERSIONINFO Resource Defines a version-information resourc ...
- hdu 3689 杭州 10 现场 J - Infinite monkey theorem 概率dp kmp 难度:1
J - Infinite monkey theorem Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &am ...
- SGU 140. Integer Sequences 线性同余,数论 难度:2
140. Integer Sequences time limit per test: 0.25 sec. memory limit per test: 4096 KB A sequence A is ...