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

4,557 阅读17分钟
作者:韩伟 

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

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

本文来自 韩大 微信公众号

相关阅读

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

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

Hadoop HA 机制学习

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

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


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