实时联网游戏后台服务技术选型和挑战(一)
概述:本文尝试从开发者角度梳理开发实时联网游戏后台服务过程中可能面临的挑战,并针对性地提供相应解决思路,期望帮助开发者依据自身游戏特点做出合理的技术选型。
维基百科关于网络游戏的定义:通过计算机网络,将专用服务器和用户的客户端设备(手机、PC、游戏主机等)相连,让多名玩家同时联机进行游戏的娱乐形式,由此可知网络游戏涉及三个角色:客户端、网络、服务器,从网络架构上来讲网络游戏可分为C/S 架构和P2P架构(特指客户端间直连通信),在实际开发中还有一种C/S和P2P架构混合:C/M架构。
P2P架构不在本文讨论范围,C/M架构和C/S架构类似,和经典的LAMP网站架构类似一般C/S架构的游戏后台也可划分为如下三
层:(1)网络接入层;(2)游戏逻辑层;(3) 数据存储层。
网络接入、游戏逻辑、数据存储层各自所面临的问题域及对应技术栈都大为不同,做此划分不仅有助于模块解耦、技术分工、组件复用,也可方便服务的运维部署。本文也着重从这三个方面来阐述游戏服务器的开发。
1、网络接入层
网络接入层的主要任务是建立客户端和后台服务以及客户端之间的信道,接收来自客户端大量并发请求,考核该层的主要性能指标是:高吞吐、低延迟。因而网络接入层开发考验的是开发者高性能网络编程的功底,即解决C10K甚至C10M的能力。
1.1协议选择
根据OSI的七层网络参考模型,我们可将网游网络也做如下7层划分:
其中4层以下都由操作系统来负责,开发者无需为此操心,在实际的开发过程中开发者首要面临的问题便是传输层是采用TCP还是UDP,下表简要对比了两者的优劣。综合两者优劣,简单来说除非对延迟有极致要求(例如FPS、MOBA类游戏)需采用UDP外,TCP可应对大部分游戏。在实际游戏开发中不管是采用TCP还是UDP方式,都很少直接通过 Socket编程方式来进行,一来因为开发工作量大,质量性能难以保证;二来平台兼容性不好(比如H5并没有提供socket编程能力),而是基于更上层的通讯协议比如基于TCP的HTTP、Websocket协议,GRPC,以及基于UDP实现的QUIC,WebRTC协议等。
值得注意的是基于安全性考虑,浏览器标准未提供UDP收发能力,QUIC协议也只在chrome得到了支持,WebRTC也还不是浏览器事实标准且协议初始目的是用于实现点对点的音视频通信,协议内容过于庞杂不容易提炼应用于游戏开发中,因而现阶段H5游戏还只能采用HTTP或Websocket方式通讯。
通讯协议确定后,随后要考虑的便是游戏对象的序列化,序列化主要有基于文本、基于二进制两种,其优劣如下表所示。在开发过程中一般会先采用文本序列化方式,便于前后端开发联调,在游戏正式上线前切换至二进制序列化方式以减少传输流量、提升编解码效率。
至于数据安全性问题,为了保护敏感数据安全开发者可以选择安全的https或WSS通讯协议,而对于直接基于TCP协议通讯,可采用先用RSA协商加密秘钥,然后使用对称加密方式将数据加密后发送。
通过以上分析,对于游戏协议类型的选择我们给出有以下准则:
1、弱联网类游戏:诸如休闲、卡牌类游戏可直接HTTP协议,对安全性有要求的话就使用HTTPS;
2、实时性,交互性要求较高:这类游戏一般需要保持长连接,优先选择标准的ws协议(同时使用二进制序列化方式),如考虑安全性可使用wss协议。而对于提供socket接口的native平台也可使用TCP协议,同时对数据做对称加密增强安全性;
3、实时性要求极高:不仅需要和服务器保持长连接,且延迟和网络抖动都要求极高(如FPS,赛车类游戏),可使用基于UDP的实现流传输协议如QUIC,KCP等。
1.2并发模型
为了处理来自客户端的并发请求,服务端有4种常见的并发模型。
1.2.1进程
进程是最早采用的并发模型,进程作为操作资源分配、调度的单位,拥有独立的运行空间。进程并发模型中每个请求由独立的进程来处理,进程一次只能处理一个请求,该模型最大的优点就是简单。如果处理请求的进程由于系统调用而阻塞或进程的时间片用完,抢占式的进程调度器就会暂停旧进程执行,调度执行新的进程,这个过程涉及大开销的上下文切换,进程并发模型的缺点是比较低效。最典型的采用进程模型的服务有Apache。
1.2.2线程
线程并发模型是进程模型的改进,线程从属于进程,是系统更小粒度的执行调度单元。不同请求可由进程内多个并发执行的线程来处理,这些线程由操作系统内核自动调度。线程相对进程的主要优势在于,调度上下文切换开销更小,但由于多个线程共享地址空间,需要额外的线程间互斥、同步机制来保证程序性正确性。典型的采用线程模型的服务有Tomcat。
1.2.3 IO多路复用
利用操作系统提供的epoll等IO多路复用机制,能同时监控多个连接上读、写事件, IO多路复用也称事件驱动模型,网络程序执行逻辑可抽象为事件驱动的状态机。 IO多路复用避免了读写阻塞,减少了上下文切换,提升了CPU利用率和系统吞吐率。但IO多路复用它将原本“同步”、线性的处理逻辑变成事件驱动的状态机,处理逻辑分散于大量的事件回调函数。这种异步、非线性的模型,极大地增加了编程难度,如nodeJs的常见的回调地狱问题。典型的采用IO复用模型的服务有Nginx,netty。
1.2.4 协程
协程也称为轻量级线程,是一种协同的、非抢占式的多任务并发模型。 协程运行在用户空间,当遇到阻塞或特定入口时,通过显式调用切换方法主动让出CPU,由任务调度器选取另一个协程执行。
协程切换只是简单地改变执行函数栈,不涉及内核态与用户态转化,也涉及上下文切换,开销远小于进程/线程切换。协程的概念虽早已提出,随着近些年年越来越多的语言(go、 Haskell)内置对协程支持才被开发者所熟知,协程极大的优化了开发者编程体验,在同步、顺序编程风格能快速实现程序逻辑,还拥有IO多路复用异步编程的性能。典型的采用协程模型的服务有openresty(Lua), gevent(Python), golang。
以上总结了目前4种常用的并发模型,它们在工作原理、运行效率、编程难度等方面有显著区别,各自有适用场景,在实际使用时应该根据需求仔细评估。在实际开发过程中如果没有可复用的现成网络组件或历史包袱我们建议使用协程并发模式开发网络接入层服务。
实时联网游戏后台服务技术选型和挑战(一)相关推荐
- 游戏创业团队的技术选型之Flash AIR
文/德义 相信大家应该对Flash比较了解,但对于Flash AIR可能就不是那么熟悉了,尤其前阵子Adobe宣布将移动版Flash Player停止维护及开发,就让大家误认为Adobe Flash将 ...
- 游戏创业团队的技术选型之Unreal
文/刁劲翀 提到虚幻引擎(Unreal),在国内开发者中可能有这样一种认识,它太重.太复杂,不是非常适合初创团队的需求.但实际上,虚幻引擎有不少特性是能够很好地帮助创业团队的,使用虚幻引擎获得成功的创 ...
- 游戏创业团队的技术选型之Cocos2D
文/王哲 Cocos2D的稳定性.可商用型和流行程度已无需证明.目前App Store中国区付费总榜前三十名约有50%是基于Cocos2D开发的,几个月来长期如此.因此: 只要你是做2D游戏就应该用C ...
- 微服务技术选型【转】
转自:https://www.cnblogs.com/wangdaijun/p/9322175.html 转: http://www.youmeek.com/microservice/ 后端类开发总结 ...
- MySQL到Elasticsearch实时同步构建数据检索服务的选型与思考
前言 本文具体探讨 MySQL 数据实时同步到 Elasticsearch (以下简称 ES ) 技术方案和思考,同时使用一定篇幅介绍一些前置知识,从理论到实践,让读者更好的理解这块内容和相关问题.包 ...
- CCtalk高可用多媒体服务技术选型与实现
本文来自沪江技术中心开发经理杨福强在LiveVideoStackCon 2017上的分享,并由LiveVideoStack整理而成.杨福强于2012年加入沪江,主要从事教学互动平台CCtalk的开发, ...
- 多云架构下,JAVA微服务技术选型实例解析
微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. 目前比较成熟的 JAVA 微服务生态包括 servicecomb(华为), spring-cloud ...
- java 微服务框架对比_多云架构下,JAVA微服务技术选型实例解析
[摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...
- .Net的后台服务技术有哪些?
ashx(一般处理程序) WCF WebService ASP.NET Web API 1 ashx(一般处理程序) 一 般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是 ...
最新文章
- 提取某个符合条件的字符串中的中文字符 例子
- 67. Leetcode 450. 删除二叉搜索树中的节点 (二叉搜索树-基本操作类)
- apache启动报错记录
- react初识生命周期
- Mac 麦克风不工作?6 种修复方法
- 4分钟看尽Top编程语言15年沉浮:C#默Java泪,Python终上位!
- 大二 数据结构 期末复习题(仅供参考)
- 电脑需要u盘启动的解决办法--蓝屏修复
- 单片机c语言多路ad转换,如何使用单片机实现低成本的高精度AD转换和DA转换
- python实现无刻度3升水和5升水准确得到4升水的代码步骤
- Vulnhub DC-7
- Manjaro为包管理器pacman和yaourt\yay 添加多线程下载
- 实验二 Java基础语法练习-基本数据类型、运算符与表达式、选择结构
- 大数据医疗面临着哪些挑战?
- QT pro文件和pri文件的区别
- 问题解决:pycharm pip无法更新,显示更新成功,但版本依然是旧版本
- 方正中间件SOA解决方案(下)
- talib 中文文档(九):Volume Indicators 成交量指标
- Adobe Lightroom Classic 入门教程(六)修改照片 --- 镜头配置文件与变换
- matlab高斯拟合多峰,MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据)