前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯互娱开源分布式开发框架 Pebble

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

原创
作者头像
韩伟
修改2017-11-15 15:41:51
3.3K0
修改2017-11-15 15:41:51
举报
文章被收录于专栏:韩伟的专栏

构建游戏世界的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

本文来自 韩大 微信公众号

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构建游戏世界的Pebble
    • 愿景:出色的游戏服务器端底层框架
    • 业务特性
    • 集群特性
    相关产品与服务
    云服务器
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档