发展历史H2Engine服务器引擎介绍

H2Engine服务器引擎介绍

简介

  H2Engine服务器引擎架构是轻量级的,与其说是引擎,个人觉得称之为平台更适宜。因为其包裹的功力特别简单,但是提供了要命简短方便之恢弘机制,使得可以为此C++、python、lua、js、php来开具体的服务器功能。H2引擎的灵感来源于web服务器Apache。大家还亮Apache封装了浏览器的之连天和商量通讯,而实际职能逻辑则经过fastcgi的不二法门到由不同之编程语言实现,本人大学之刚接触php的时节,看到在php里print的字符串直接就应运而生于浏览器里,当时之感觉到就是哇!这接口设计的正是了不起!因为每个程序员最先学会的便是print,就见面深感这接口设计的正是简单好用。所以php真是当之无愧的最好好之编程语言(哈哈)。后来一直从事游戏服务器出,发现于服务器引擎领域就是径直尚未这种Apache类似的计划性好通用、易理解、易扩展的引擎。现在游戏服务器领域大部分品种都是每打各的,每个主程各为一仿好因此之赏心悦目的架构。有些大厂或者连带的局开源了有些服务器引擎,乍一拘禁专门吊,但是跟Apache+php的这种架构相比,其易用性难以望其项背。当然服务器的长连模式比web的request/response的模式本质上产生重要命的复杂性,服务器引擎的统筹难点主要有如下几点。

  1. 报道协议没有正经。大家都知,http有行业标准,所有浏览器还是依专业以及服务器通信的,而通信部分的兑现是服务器最为根本的有,服务器程序员一般都懂得,《网络编程》没看罢几总体是摹写不了服务器程序的。一般而言服务器会使二进制通信,常见的组包格式来2字节商事号+2字节标记+4字节包体长度+包体数据,这种协议格式紧凑,2字节之符留作扩展为较足用,比如是否启用压缩、加密当,但是这种针对一些编程语言不是生要好,比如js就无法采取这种协议。
  2. 信息封包没有正儿八经。消息封包常见的生struct二进制、自研的序列化、pb、thrift、json等几乎栽样式,而以web领域,一般如果不json要不xml。在服务器领域一般以pb的较多。
  3. 编程语言多样。服务器编程语言为快速,总体以c++为主,但是java、c#、python、lua、php、js也愈加流行,尤其是c++嵌入lua的模式盛行。让服务器引擎像Apache一样好支持各种语言,实现达标很有难度。
  4. 起与异步。通常游戏服务器为了平衡游戏复杂性和特性,采用多进程且每个过程主逻辑单线程的方案,多进程增加吞吐,单线程的先后还好管平稳,为了主逻辑不打断,几所享有的io操作都是异步完成的,这与Apache的理念来老要命之区分,这让Apache引擎很麻烦封装的比如Apache那样简洁,市面上稍微人尝试了为此协程简化异步,但是当前尚形成相对成熟的方案。
  5. 数并的繁杂。Apache中php也是基本上进程的,但是非共享数据,无状态的php设计自己就是大大降低了复杂,但是长连是发出状态的。php中管状态数据放到memcahe、redis等内存数据库中,游戏服务器的大多进程架构中也在所难免发生数据要共享,比如行会数据,但是比如php那种通过分布式内存数据库同步方式取在性质达到(比如实时rpg游戏)是无法忍受的。如果运用异步获取,逻辑代码势必支离破碎,到处都是回调,难以保障。通常的缓解方案是独自拎出一个历程处理共享数据,比如CenterServer处理行会请求,所有行会操作都见面转到CenterServer处理,再将结果共同到其它进程,这样非有多少竞争及联合的特性问题,但是逻辑因为异步仍然是复杂了专门多。
  6. 性能难以量化。大家都了解Apache提供了ab程序可以量化服务器的习性,在服务器领域几乎无通用的量化工具。一般还是会上线前用机器人压力测试一下,不可知挺好的量化各个接口的习性,web领域对接口性能量化的家伙比较多,很成熟,确实值得研究上,因为优化的规格就是是长存数据还优化,必须懂得哪些需要优化,优化了发生略力量。

  那么什么样化解上述问题吧?经过闭关苦思七七四十九天,终于有所开悟,继而设计出来了H2Engine服务器引擎。接下来本文将阐述H2架构的宏图细节,以及是怎么演变得来。

H2Engine服务器引擎的演变

  先看下最为常见的嬉戏服务器架构图:

发展历史 1

  
这个架构是特别成熟的,同时充分考虑了网可伸缩性。Gate和GameServer是性质的主要,这片单还足以平行扩展,H2引擎就是自从夫架构抽象而来。首先看Gate这个组件,每个Client连接一个Gate,而GameServer具体产生多少只凡是本着client透明底。因为可以启动N个Gate,所以是架构理论及得支持N个Client。linux实现之Gate单个进程撑2万一连已不是问题,但是对于分服方式的RPG游戏,有谁能不负众望单服在线2万底?我们的游戏还是限量6000每当线上限,超过就得排队了。主要是害怕后止GameServer太卡,因为玩家有聚效应,都见面集中在较紧俏之地形图及。所以现在linux
epoll单机如此大性能的根底及,单个gate进程玩家就足足应付一个区服的Client连接。所以于上头的架构图中简化为单gate,如下图:

发展历史 2

  
这个时节发现LoginServer的效益就是出来鸡肋了。LoginServer本来是近似于DNS的法力,它会回来负载最小的Gate给Client,从而确保Gate的载荷均衡,但是本曾单Gate了,LoginServer变得不是死有必不可少了,原来的LoginServer上的账户证明功能全移植到GameServer来做。所以在H2引擎架构中,不再出LoginServer的角色。

发展历史 3

  
Gate和GameServer肯定是勿可知少之了。DB是休是是要的组件为?答案是否定的。如果起DBServer发展的历史来拘禁,当DBServer出现的时刻,内存数据库尚无起,如今,Memcache、Redis等内存数据库已经流行,无论由效率要稳定,或者灵活性上,都更值得推介。从运维角度说,他们保障通用的内存数据库也再度发生更。但是就我看来,大部分景下连Memcache、Redis这种还非需,直接GameServer缓存一下不怕推行了(主要是拍卖下断线重连,手游闪断还是挺频繁之),因为GameServer本身就是有状态的服务器,
从上线后玩家数据就是已载入内存了,相当给具有的念操作都是缓存好之,所有的创新操作直接写数据库理论及全好支撑,而且直接写数据库也避免了聊回档问题。因为毕竟写操作对于读操作量层小太多。如果确实采取场景需要缓存数据,那么部署一个Redis吧。去丢了DBServer,H2引擎架构简化成了只有来Gate和GameServer,这次真简化到巅峰了。

发展历史 4

  
下面给咱们来讨论N个GameServer应该放开几玉机械及的问题。标准答案当然是需要几华放几令,但是如果您身边有运维的话,他或让来之答案是一模一样光机器,为什么呢,原因这个是如此运维更方便管理,下发程序、配置、重开、监控等呢再易。原因该是今日机械还是多核cpu,内存也是多的,单台机器的处理能力及往不行同日耳语。GameServer是主逻辑单线程的,如果相同贵机器及配置一个,那么cpu资源无法获取更好之动。就我经验而言,GameServer很少用过4只,为甚?想想看,如果一个RPG游戏单服设计在线1万丁,平均分配到每个过程也不怕是2500人数,很轻松啊,当然要人口了多聚集在么进程,那还时有发生发出或么GameServer成为瓶颈,这种状态差不多开GameServer也解决不了问题。从cpu利用上吧,GameServer主逻辑单线程只能用一个cpu内审查,考虑到开停io线程的计算需要一个cpu的计算量,那么平均2独cpu,4独GameServer也不怕是8单cpu,现在服务器无8按好意思说凡是服务器?以往更来拘禁,玩家会于集中在热点地图,一般会之一或某某片独GameServer相对会cpu较高。另外一个服务器角色Gate是io密集型的,所以跟GameServer放到一个机器上,也是扛得住的。这样以H2引擎中,完全有理由将经过全部走在一个机械及,先上一个架构图,然后又谈一下这么设计出何特征。

发展历史 5

  
到此处大家发没有出察觉,跑在同样光物理机的Gate和GameServer像不像Apache和php的涉嫌?到者,H2引擎的雏形已形成。Gate在这边去Apache的角色,GameServer以此地虽是php的角色,Apache有同等重合fastcgi的物实现进程之中通信,只要依照fastcgi的正规化,就足以为Apache支持任何的编程语言,在H2引擎中,也筹划了一样法进程之中通信机制ffrpc,区别为Apache的fastcgi,ffrpc是基于消息+回调机制的长连通信方式。ffrpc的贯彻小无进行了,现在H2引擎里早就实现了c++、python、lua的支撑。H2的雏形已起了,还用更的肤浅完善,因为H2不仅可用来打服务器,在实时聊天、消息推送等需加上连的用场景呢足以适用。所以为了更加爱懂,对Gate和GameServer组件的称谓进行重新命名,变得越来越通用一些。

发展历史 6

  
前边谈到服务器引擎计划的6十分难题,下面讨论下于H2引擎中是什么样解决的。首先是通信问题,Apache通用是坐Client都是为此http协议,那么可免可以被游玩服务器的Client统一用某种通信协议呢?坦白说不过碍事矣。但是自己看,随着websocket的日趋普及,websocket可能出一统江湖的或是。其实有矣websocket大家温馨计划通信协议的理由都不行有些了。H2集成了个别栽通信协议,websocket和常见的二进制协议,如果你的Client已经采取了websocket,那么连H2就是so
easy了。

  
对于问题2数量封包的处理,H2给有底答案就是是随便为要临床,既然没有专业,那么H2也非干涉你的选项随机,交给H2Worker处理,数据封包对于H2引擎是晶莹剔透底,但是建议大家用pb或者thrift就吓了,H2的ffrpc就是使用了thrift完成的历程之中通信。本人再度推荐thrift,因为thrift对于各个语言的支撑更好,对于js这种处理二进制尴尬的语言都配合的要命好。

  
问题3的多语言问题,H2设计了ffrpc库,每个语言就需要连接并促成几乎个简易接口就好了,相当给每个语言都需要支出协调专用的H2Worker,比如H2WorkerPhp、H2WorkerPython、H2WorkerLua等,目前C++、Python、Lua、js、php的Worker实现既集成到H2Engine中,也就是说要您想用lua或者python来写戏服务器,那尔直接写脚论就可了。H2Engine晚些会在支持之言语是C#。

  
问题4连作以及异步的问题,H2Engine的宏图是主逻辑单线程,提供一个IO线程池,IO操作用异步+回调的法门成功。其实IO操作主要就是是数据库操作,IO线程会创建一个异步IO句柄,每个IO词柄投递的IO异步操作都是串行保证顺序的,所以IO线程池既能够保证多线程并发,又能确保比如对有User的操作是逐一的、可靠的。

  
问题6性质量化的题材,由于客户端的恳求通过引擎被处理,那么H2Worker上便好搜集到持有接口的性能数据,统计后格式化定时输出,这样虽得量化各个接口的之习性。甚至足以出有图形化展示工具,可以看接口性能随时间的转,或者不同接口间性能的较。

  
最后要讨论问题5数量共享的问题。前边提到ffrpc提供了基于TCP进程之中通信的体制,对于单机还是多机,都是凭差别的,那么H2Engine和H2Worker理论上加大不同机器也是好的。事实吧的确如此,H2引擎其实对多机是圆支持的,但是为什么以H2的架构限制于与机也,这根本是考虑到多少共享的需,同机情况下,H2Engine和H2Worker就得经共享内存共享数据,其效率以及便捷性与多机tcp模式不可同日而语。经过权衡,要较优雅的贯彻进程之中共享数据,限制在一起可以大大的降低复杂性,虽然牺牲了片可伸缩性。

发展历史 7

  首先SharedMemory并无存储共享的数目,只存需要更新的数码,相当给共享内存作为交换数据的媒婆。进程之中共享数据的流水线如下:

  1. 每个H2Worker维护一个团结的ShareMemDataSet,在共享内存中创造一个信号量,并且独自开一个线程,监听在此信号量上,如果让触发,则马上从共享内存拷贝要翻新的数目到祥和之进程,并送被主逻辑线程去更新SharedMemDataSet。由于ShareMemDataSet是主逻辑维护的,这样的便宜就是是主逻辑线程如果只是读取而非改动,那么直接下本线程的SharedMemDataSet数据,性能自然是杠杠的,比如行会数据貌似读取操作远大于写操作。

  2. 设若H2Worker要修改共享数据,他将要获取共享内存上的全局锁,然后拷贝要创新的多寡到共享内存,然后提醒其他H2Worker的信号量,待有数据被拷贝了后,解除全局锁,因为更新操作必然是主逻辑操作的,所以得到完全局锁后,主逻辑会自动检查一下本地要创新的操作是否尽成功,保证加锁完毕后,当前过程的SharedMemDataSet一定是最新的。下面来同样段落模拟行会操作的伪代码:

  这种数量并有多单便宜,首先是数竞争,共享内存加锁同步数据,效率非常强,使得加锁之粒度较小,避免多进程锁竞争。其二是翻新操作特别像发送信息,区别为异步发送信息之建制是,消息发送完,其他worker的数码立马收获了更新,这是异步消息发送机制不可知比较的。

总结

  1. H2引擎集成了websocket,也引进大家以加上连使用被,逐渐使websocket。
  2. 商的封包pb、thrift已经生足用了,H2引擎支持pb、thrift、json以及民俗二向前制struct,但是推荐thrift,主要是效率及多语言支持且还好。
  3. 依据网游服务器的光景,H2引擎考虑到单台物理机的拍卖能力时可应付单服的急需,所以用H2的架构设计为布局于共上,这样大大简化了服务器的架,多gate的架构其实来自rpg刚兴起的年份,那时候服务器的内存有限,cpu多按也尚没有流行,但是不同,单机模式为尽管是伪分布式模式其实更符合实际。
  4. 针对传统网游服务器架设中几近进程数据共享的痛点,H2做了新鲜的规划,由于H2Worker在平等台机械上,得以而H2可以透过共享内存共享数据。
      大家懂得,Apache+php之所以在web领域里盛,还有特别十分一个缘故是php的框架而大多以好用,相比而言,网游服务器领域的引擎、框架还不过落后了,主要由要服务器无变异规范,这吗是自身从业多年,孜孜不倦想使有所突破的地方。从web的成熟经验来拘禁,功能开发之赶快,就设发很多框架,要发生好的框架,就假设发出成熟规范的发动机,现在市面上稍加游戏服务器引擎就时会面混杂引擎以及框架的效益,有的还是夹杂了一日游服务器的数据结构和游戏逻辑。H2的宏图哲学,引擎的归引擎,框架的由框架,虽然跟Apache相比距离“引擎”的称呼相距甚远,但是这是H2的对象。另外,基于H2的框架为会没完没了的增多到。举个例子,针对rpg游戏,我们好计划来同样仿c++的框架,比如封装地图管理、角色管理、道具管理、任务系统、成就系统、副本系统、npc系统等,想想看,2d
    rpg领域相关的系还是很好抽象的。问题是无正式的、成熟的发动机作为基础。相关从业人员应该出同感,比如A团队开发同套任务系统,给B团队吗是故非了啊,大家的定时器、数据库接口都未一致,无法形成用来就是因此。如果大家都为此H2,别人开源的网分分钟便可以以来所以,想象下或大美好的。不同的玩乐类框架实现是勿等同的,不同语言实现细节为会不同,使用H2引擎后可根据不同游戏项目、不同语言分类框架,这个是延续扩展H2引擎的计划。

连带连接

  1. 文档 http://h2cloud.org
  2. 源码 https://github.com/fanchy/h2engine

发表评论

电子邮件地址不会被公开。 必填项已用*标注