我们最开始做的游戏框架,多数都是client—>server—>db的模式,但是随着玩家数量的增加,一个server进程就会扛不住,需要多个进程服务于多个玩家。但是给定了不同进程的玩家,有可能需要交互,这就导致了client与server端的连接,有可能是o(1),但也可能是o(n)连接,o(n)的扩展性非常差,不容易维护,因此可以剔除了。但是如果只保持o(1),那必然要引入新的抽象服务,网关也就登场了。下图是一个简单的网关部署架构:

网关的引入,有哪些改变呢?
  • 内外网解耦,在保持客外网客户端不变的情况下,可以通过这个中间层调整内网服务的实现
  • 规范化,由于请求是网关统一接受和分发的,会直接促使客户端在发送和接受请求时规范化
  • 安全,由于网关具有收口作用,所有的安全问题都可以在这里解决,保护内网,比如反爬,认证等功能
  • 限流熔断,在网关上实现限流,避免内网被突发流量压垮
  • 统一的监控告警平台
有了网关后,开始在下游增加业务逻辑,可能我们会把所有的业务都耦合成一个service,比如聊天挂了,派系挂了,场景挂了,都可能会对有戏本身产生影响;基于此,不得不考虑拆分进程,之前的游戏service服务,可能会被拆分为多个服务,但是对于大多数的游戏开发人员来说,基于服务的开发,比基于进程的开发,也难的多,如果不是领导推进,也不会有人愿意把聊天做成一个单独的服务。
对于游戏来说,服务拆分最最极端的情况,就是一个消息cmd对应了一个service,但是这种情况会导致service越来越多,无法维护的程度,实际上游戏拆分也确实没有必要。不过服务service越来越多,某个service甚至处于内存,cpu瓶颈的状态,应该如何解决呢?这时候rpc的服务治理派上了用场。我们对上面的图示做下改动:

game-rpc的引入,解决了哪些问题呢?
  • 开发人员不再需要关注内部通信机制,减少项目开发时间,降低成本
  • 强大的集群容错,负载均衡能力等,保证每次调用都能路由到合适的节点
service与service做成了集群,每个service启动后,往zk或nacos注册中心注册自己的url。gateway在启动后,订阅zk注册中心的service列表,依托于rpc本身强大的集群,负载等功能,可以自动实现service的切换。
在针对rpg等长连接游戏类型时,玩家在场景中的移动都需要同步,广播给周围的玩家,但是rpc是单通道的,不能回传,这应该如何处理呢?
有借于此,game-rpc增加了全双工的概念,不仅仅是client对service的请求,同时service也可以根据uniqueId,进行主动推送。于是上面的流程图变成了下面这样:
 
 
一切看上去都很完美,似乎没有问题了,然而新的问题随之出现。
我们知道,优秀的架构体系中,单点问题是不能容忍的,很不幸,我们的gateway,就出现了单点。随着玩家数量的增加,整个服务都会处于不可用的状态。于是网关需要拆成集群的模式,新的架构图显示如下:
 
 
网关拆分后,gate1和gate2的玩家是两个tcp长连状态的服务,无法交互,这应该怎么办?
我们参照了现行市面上比较常用的tcp网关做法,消息下行通知的解决方案,目前框架支持了两种方式:
  • MQ广播机制,当某台网关服务器收到广播消息后,MQ通知给集群内的所有gate server,每个gate在收到消息后,判断要推送端的消息是否是当前gate所持有的会话,如果在当前服务,则进行推送,否则抛弃
 
 
  • redis session共享,针对MQ的广播机制,如果以后游戏火爆,同时有百万玩家在线,那么gate集群里的机器,可能会达到上百台不等,如果每个消息都需要MQ广播,有可能会导致信号风暴,于是我们调整了最后一种解决方案。玩家在登录网关,认证成功后,把玩家id作为key,当前连接的网关uniqueId作为value,存储到redis集群中。网关随后把消息路由到具体某个service,service从redis集群里获取到需要广播的玩家对应的gate服务,service通过rpc消息下行,直接推送到具体的gate,再由gate转发到client
 
 
说明:这种架构,更适用于全区全服类型的游戏。目前我们已经有多款线上游戏使用。
更多交流,也欢迎您关注我的微信公众号:

rpc服务在游戏中的简单运用的更多相关文章

  1. (整理4)RPC服务和HTTP服务简单说明

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  2. log4j2自定义Appender(输出到文件/RPC服务中)

    1.背景 虽然log4j很强大,可以将日志输出到文件.DB.ES等.但是有时候确难免完全适合自己,此时我们就需要自定义Appender,使日志输出到指定的位置上. 本文,将通过两个例子说明自定义APP ...

  3. 使用PHP来简单的创建一个RPC服务

    RPC全称为Remote Procedure Call,翻译过来为"远程过程调用".主要应用于不同的系统之间的远程通信和相互调用. 比如有两个系统,一个是PHP写的,一个是JAVA ...

  4. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

  5. 游戏中VIP会员模块的简单实现

    哈哈  今天周末有时间,再整理一篇博文上来,虽然已经不做游戏老长时间了,但还是要把以前做过的东西总结一下,借此可以回顾以前的东西,也可以分享给大家. 今天说一下游戏中VIP会员模块的实现思路.每款游戏 ...

  6. 基于netty轻量的高性能分布式RPC服务框架forest<下篇>

    基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...

  7. 基于netty轻量的高性能分布式RPC服务框架forest<上篇>

    工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...

  8. Thrift 个人实战--Thrift RPC服务框架日志的优化

    前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...

  9. 基于开源Dubbo分布式RPC服务框架的部署整合

    一.前言 Dubbo 作为SOA服务化治理方案的核心框架,用于提高业务逻辑的复用.整合.集中管理,具有极高的可靠性(HA)和伸缩性,被应用于阿里巴巴各成员站点,同时在包括JD.当当在内的众多互联网项目 ...

随机推荐

  1. SpringBoot-01-快速入门

    SpringBoot 1. 快速入门 什么是Spring 轻量级的Java开源开发框架 为了解决企业级应用开发的复杂性而创建的,简化开发 Spring是如何简化Java开发的 ​ 为了降低Java开发 ...

  2. hystrix源码之hystrix请求变量

    HystrixRequestContext 请求的上线文实现,内部定义了一个静态变量ThreadLocal,每个线程可以获取自己的HystrixRequestContext对象.一个请求往往由一个to ...

  3. Anaconda使用及管理

    接下来均是以命令行模式进行介绍,Windows用户请打开"Anaconda Prompt":macOS和Linux用户请打开"Terminal"("终 ...

  4. 刷题[b01lers2020]Life on Mars

    解题思路 打开网站,检查常见的信息泄露,漏洞扫描等,都无hint.这时候有点难办了,又找了一会儿,发现抓包标签时,get的值会有参数 尝试访问,发现有如下内容: 因为实在其他地方找不到任何思路了,看着 ...

  5. Helm部署和体验jenkins

    如何快速且简单的部署 通过helm可以快速且简单的部署多种应用,关于helm的安装和使用请参考 环境信息 本次实战的环境信息如下: kubernetes集群:三台CentOS7.7服务器 kubern ...

  6. sping ioc 源码分析(一)-- register(componentClasses) 方法

    一.测试环境的搭建: public class Apple { } @Component public class MyComponet { } public class MyCondition im ...

  7. Centos-上传下载文件-rz sz

    依赖: ssh协议.远程终端 .lrzsz软件包.window操作系统 安装 lrzsz 软件包 yum install -y lrzsz 下载命令 sz sz fileName 上传命令 rz 相关 ...

  8. makefile实验四 编译本地的源文件 + 变量的高级主题一

    <一>编译本地的源文件 + 变量的模式替换    实验代码 root@ubuntu:~/Makefile_Test/5make_test# vim makefile target := t ...

  9. Git多人项目开发流程演练

    1. 前言 本文利用 GitHub 平台进行一个多人项目开发流程的演练,以加深课上所学内容. 参考文献:五⼤场景玩转 Git,只要这一篇就够了! 2. 初始化项目 2.1 新建远程项目 一个多人项目通 ...

  10. 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句

    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...