意见征集 游戏服务器实践之路
大家好。
我是一个热爱技术的人,从事商业的服务器开发9年多,参与和负责了几款不同类型的游戏开发,包括SNS、ACG和RPG;也负责过IM的开发。运气比较好,属于实战型的程序员。我想写一个游戏服务器的序列文章,主要是自己实践的总结。发帖目的是想大家给点意见,怎么写,对须要经验分享的人有效果。我将在业余时间慢慢写,慢慢地写,争取每一部分都对读者有益。
首先说一下我的写作原则:
1 实践干货
从实践出发,没实践过的,尽量不写。如果一些平时技术学习类的内容,会单独作为章节列出。人非圣贤,必有错,实践的内容不合理,大家指出,表示感谢的同时立马改正。
2 简单平实
介绍的内容不玩虚,能用简单方法实现,绝不用奇淫怪巧的技术,把事情搞复杂化,以显示自己的技术水平。很多地方用到多线程,但实际是无互斥、无同步,写逻辑和单线程的无差别。对于性能优化也适可而止,防止代码复杂化,出Bug。
3 不发明轮子简单介绍序列文章的组织结构,不同的读者查阅方法等,软件平台约定之类的。这章没什么好说。
由简入全的方法介绍分别对应不同的游戏类型服务器架构,不同类型和不同分区方式的服务器架构基本大同小异,我尽量整理出共同点,然后附加说明SNS类游戏需求比较奇葩架构方面处理方法。游戏服务器架构我个人倾向于分接入、逻辑和存储三个层次去实现,实际内容也按这三个层次展开。
2 网络通信
设计理念
讲述性能与实现复杂度的取舍。
多线程使用之道,这个不是直接介绍如何使用线程、处理线程间的数据同步,这些技术相信大家都很容易掌握。文章将着重讲述多线程无互斥(Lock-Free)实现的方
法,逻辑层与通信层线程上下文的关系。最终我们得到的结果是,用了多线程,但无须互斥(加锁),最大发挥多核的威力;写大量的逻辑层代码的时候,和写单线程代码
一样,简化逻辑,使系统稳定。
通信功能
还是有必要花时间介绍select(Windows客户端有时候要用)和epoll。
缓存队列-无锁Buffer
缓存队列-减少数据拷贝
逻辑层服务器抽象对象
这块是逻辑层和通信层的桥梁,这里涉及到多线程的无互斥的细节。看过公司的几个项目,发现这一块其实做得不理想,存在CPU的浪费。所以我的方法应该还有一定
的参考价值。
TCP流和应用层的消息
简述TCP流, 提供一个简单的TCP流转化为应用层的消息的策略;简述常见的几种消息Encoding&Decoding的策略,简单地分析取舍。这里将提到我们项目里用到的
第三库,protobuf;还会提供一种基于二进制Encoding&Decoding的实现。
这些服务器完全通用,不同的项目基本上可以直接使用。
通行证服务器
有的公司做的服务器都是每个项目都有各自用户名密码验证模块。这里将介绍用Kerberos实现的通行证服务器。
更新服务器
服务器列表服务器
接入服务器讲述为什么要用接入服务器,如何实现。
公会模块独立地在一个进程里,如果公会会影响另外一个进程中的战斗Buff,影响玩家的人气值的获取,怎么办?强制交互是下下策,会让我们代码变复杂,不易维
护。这里将会给出比较合理的参考。下面联盟之类也类似。
联盟、血盟模块实现
附录
1 大世界游戏服务器
有一段时间业余的兴趣爱好,当时也只是实现了简单的demo,没有机会在实际项目中应用过。这个讨论大地图的一种比较简单实现方法,涉及到前面章节的多线程的无互
斥的技术。讨论的服务器不是可以无限大,是基于单台服务器如果核数足够多的话,如何充分利用多核,支持更多的玩家逻辑处理。某个角色可能跑到任何的线程中,编程的时候,就全部采用异步的方式,即时交互的双方是在同一个线程中。