腾讯互娱开源分布式开发框架 Pebble

做者: 韩伟 

构建游戏世界的Pebble

愿景:出色的游戏服务器端底层框架

现代游戏项目中,为了让更多的玩家能在一块儿玩,游戏服务器所须要承载的在线玩家数量愈来愈多。同时为了让游戏更好玩,愈来愈多复杂的业务逻辑都须要放在游戏服务器端上运行。所以,拥有一个同时具有可灵活扩展功能、而且能轻松构建服务器集群的底层框架,变得愈来愈有必要。这样游戏程序员能够专心编写好玩的游戏逻辑,而无需去担忧服务器承载量的问题。git

Pebble的含义是“基石”。咱们开发这个框架的目标,就是但愿它能坚固、可靠,发挥做为基础开发框架的做用,成为游戏服务器的基础代码。Pebble诞生于腾讯公司的游戏研发部公共技术研发中心,这个中心已经为腾讯游戏提供了多年的底层技术和服务支持。从端游、页游到手游、电视游戏,这个团队都一直走在游戏研发技术的前列。Pebble这个产品,正是他们多年游戏研发技术的积累和游戏支持经验的结晶。程序员

价值观:易用、灵活、云github

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)研发部,在多年支持腾讯游戏经验积累下,开发的一款通用型游戏服务器端开发框架。此框架的使用很是容易学习,能够在几乎无依赖的环境下,知足全部常见的游戏服务器端基础功能;同时也具有无须修改业务逻辑代码,就能够创建起海量承载的分布式集群;最后,这个框架还能配合腾讯云的分布式计算平台,提供自动化运维、丰富运维监控和日志统计、资源智能弹性伸缩的能力。

本项目开源地址:github.com/tencent/peb…

本文来自 韩大 微信公众号

相关阅读

使用 Rust 构建分布式 Key-Value Store

腾讯云分布式数据库可用性系统实践

Hadoop HA 机制学习

此文已由做者受权腾讯云技术社区发布,转载请注明原文出处

原文连接:https://cloud.tencent.com/community/article/614135?utm_source=jueji


海量技术实践经验,尽在腾讯云社区

相关文章
相关标签/搜索