前言
近期转换了工作方向,从WEB开发走向了游戏开发。
此前的工作中,主要负责WEB分布式项目的开发,REST服务开发,并包含一部分IM系统的开发。分布式系统框架,数据库,NoSql接触的比较多,比较杂。
而新工作比较单一,主要负责游戏服务器的业务开发。使用的也是前辈封装好的框架。后来发现,原来全公司都使用了这一套公共的架构。
相对之前的工作,工作内容接触新技术相对较少。而且,由于公共框架时间久远,现在看一些工具和接口封装已经不是最佳方案。
鉴于此,考虑把前人的*拆掉,好好研究一下。(不得不说,前辈一个人手写的一套Netty+SpringMVC+缓存数据库系统+ORM的服务器架构,屌的不行)
从今天开始,实现一套自己的开源框架,在实现其功能的情况下,争取对前辈的作品进行优化。
游戏服务器与普通WEB容器对比
根据个人经验,游戏服务器和普通的WEB容器,如tomcat,JBoss,Jetty等,存在巨大的差异。而游戏服务器,实际与IM(即时通讯服务器)较为相似。具体对比包含以下方面
一、请求交互方式
WEB 服务器
主要为B/S模式,绝大多数请求是由客户端发起,向服务器端请求数据。IM和游戏服务器
通常,既需要接受客户端发送的数据和请求,又需要主动的向客户端发送数据。
而且,由Server到client的情况十分频繁。
例如,IM需要转发数据给另一个用户、游戏服务器需要将战斗结果发送给两个客户端
二、连接状态对比
WEB 服务器
每个请求其实都是短链接,无状态的。不需要长时间保持一个tcp链路。
且一个用户的数据请求在短时间内的数量不会太大(相较IM和游戏服务器而言)IM和游戏服务器
数据发送十分频繁,因此要求每个客户端尽量保证一个tcp长链接。
三、服务器扩展对比
WEB服务器
通过一些CDN、反向代理、负载均衡、增加服务器的方式即可完成。
因为通常的WEB服务器是http短链接的,因此tcp链路是可以复用的,不会轻易耗尽资源。
这种方式就可以实现扩展性能。IM和游戏服务器
由于一台物理服务器的最大TCP连接数的受限的。因此,必须使用多服务的这种方式。(这也是为什么游戏通常具有几K个服务器)
并且,拆分更多的分布式微服务。-
IM和游戏服务器
数据发送十分频繁,因此要求每个客户端尽量保证一个tcp长链接。
四、业务操作对比
WEB服务器
复杂计算少、IO密集但读多写少。IM和游戏服务器
复杂计算多,因此计算密集,IO密集,且读写都频繁。
五、使用Netty构建高性能服务器的优势
便于分布式微服务部署
一个游戏服务器系统,通常不是一个netty服务构成的,而是由独立的地图服务器、登陆服务器、逻辑服务器等组成。
基于Netty的NIO可以较好的处理系统之间的网络通信,性能较好。支持多协议
Netty支持多种协议,编码灵活。通过使用protobuf可以实现适应多种游戏场景的协议和私有协议编码。
如在IM中,如果进行视频传输,我们可以使用UDP协议。进行文件传输,我们可以使用TCP传输。对于传输协议的格式,也可以使用Protobuf实现。-
可配置TCP连接数线程池
可以提高差异化控制能力。
提供基于TCP的长链接,可以满足游戏服务器长时间保持连接的需求,同时具有心跳机制保活和检测链路。