跳到主要内容

同进程亲和性

介绍

同进程内不同 Netty 实例通信时,是通过内存进行传输的,不需要经过网络传输,数据传输速度极快。 也就是说,如果我们将游戏对外服、Broker(游戏网关)、游戏逻辑服部署在同一个进程中(也就是单体应用),那么各服务器之间是在内存中通信的。 甚至可以简单的理解为在同一 JVM 中的 a 方法调用了 b 方法,b 方法调用了 c 方法。

同进程亲和性是框架的特性之一,可以让同一进程内的 Netty 实例拥有相互访问优先权。当有请求需要处理时

  1. 即使你启动了多个 Broker(游戏网关),游戏对外服会优先将请求交给同进程内的 Broker(游戏网关)来处理。
  2. 即使你启动了多个相同的游戏逻辑服,Broker(游戏网关)会优先将请求交给同进程的游戏逻辑服来处理。
  3. 同样的,游戏逻辑服处理完请求后,会优先将响应交给同进程内的 Broker(游戏网关)。

部署简图

  • pid : 表示在同一个进程内。
  • External : 是游戏对外服。
  • Broker : 是游戏网关。
  • GameLogic : 是游戏逻辑服。
  • CommonGameLogic : 是一些公用的游戏逻辑服。 An

图中,我们启动了 3 个进程。

  • pid:1111,启动了游戏对外服、Broker(游戏网关)、游戏逻辑服[A-1、B-1]。
  • pid:2222,启动了游戏对外服、Broker(游戏网关)、游戏逻辑服[A-2、B-2]。
  • pid:3333,启动了多个公共的游戏逻辑服。

由于在同一个进程中,当 pic:1111 有 action 请求需要处理时,会优先交给 A-1 处理。 而一些跨服的公共业务,则会将请求交给 pic:3333 来处理。

提示

同一进程内,不同 Netty 实例之间的通信是通过内存进行传输的,不需要经过网络传输,数据传输速度极快。

合理利用同进程亲和性,可以让各服务器之间通过进程来做微隔离。

使用场景

开发者可以利用同进程亲和性的特点,按照上图中的部署方式,可以让各服务器之间通过进程来做微隔离。 此外,又能提供一些游戏逻辑服来处理公共业务。 如一些跨服活动、跨服战...等,各种跨服业务

如下类型的游戏,可以考虑使用该部署方式

  • 滚服类型的游戏
  • RTS(Real Time Strategy)实时战略游戏,例如星际争霸、红色警戒。
  • MOBA(Multiplayer Online Battle Arena)多人在线竞技场游戏,例如英雄联盟、DOTA2。
  • ARPG(Action Role-playing Game)动作角色扮演游戏,例如暗黑破坏神、无尽之剑。
  • FPS(First-person Shooter)一人称射击游戏,例如使命召唤、绝地求生。
  • TPS(Third-person Shooter)第三人称射击游戏,例如疾速前进、战地。
  • ...

最后

ioGame


从架构简图中,我们知道了整体架构由三部分组成,分别是 1.游戏对外服、2.游戏网关、3.游戏逻辑服,三者既可相互独立,又可相互融合。

所以,使用 ioGame 几乎可以满足任意的部署方式, 可以根据你的需求来适应不同类型的游戏,并且在 ioGame 中做这些工作是简单的。

为了更简单的说明三者之间的灵活性,现在把三者用字母代替, A.游戏对外服、B.Broker(游戏网关)、C.游戏逻辑服。 我们可以得出如下组合

  • ABC : 三者在一个进程中,他们之间使用内存通信,无需传输。
  • AB + C : 游戏对外服和游戏网关在一个进程中,他们之间使用内存通信,传输一次。
  • A + BC : 游戏网关和游戏逻辑服在一个进程中,他们之间使用内存通信,传输一次。

通过上面的组合,我们可以看出,ioGame 架构是支持类似传统架构那样只做一次跳转, 甚至可以做到零跳转,这完全取决于你们的部署方式。

上面三种组合方式,都具备同进程亲和性。同进程亲和性生效的要点只有一个,至少保证有两部分在一个进程内。