上一篇简单介绍了游戏服务器的发展以及服务器的核心三大架构,CPU、内存和网关([立即转到])。
一个简单的服务器,仅仅利用网络数据交换进行一部分的数据运算,但是对于游戏服务器来说,数据运算是非常大的,如果CPU的架构没有处理好,服务器的性能将会大打折扣。本篇将以CPU的架构为重点,详细介绍游戏服务器的开发(如有错误,请指出,谢谢)。
一、"同步-多线程"模型
使用这个模型,当有玩家进入服务器时就会新创建一个线程。这样子,服务器可能会同时有很大的用户要进行处理,压力非常大,并且线程之间不断切换降低了CPU的性能,如果多个线程要同时对一块内存进行操作时,必须要通过阻塞线程的方式,避免抢占资源。那么使用这个模型,必须要求开发人员编写代码和调试代码时足够的细心、耐心,修正大量的bug。
二、"同步-多线程池"模型
在服务器开启时,提前创建出来足够的线程,这种固定的线程池,可以通过分配的方式避免大量用户涌入服务器,减轻对服务器的冲击。而当线程池全部分配完后,其他进入的玩家必须进入等待的队列中,形成排队机制。开发人员需要重点关注与多线程访问同一块内存时的阻塞状态,进行数据同步,并且还要注意线程池的申请和释放,否则,很可能会造成严重的线程消耗而不得不重启服务器。
三、"异步-单线程"模型
服务器进程中,阻塞调用网络IO是非常常见的,当服务器开始调用某个函数时,会阻塞当前进程,等待函数计算完成返回数据后继续当前进程,这样可能会因为数据量计算很大而卡顿。所以,采用不同平台下的消息队列模型,合理利用回调机制,可以减少服务器端的阻塞IO,同时也解决了多线程锁的问题。但是某些API并没有提供回调的机制,线程依然会被阻塞,单进程单线程就不能发挥当今服务器的多核多CPU的优势。但是大量的回调函数,会加重代码的不合理性,所以一般会使用"异步+协程"的方式来发挥服务器的性能。尽管如此,单线程无需并发的思想,性能好,是很对团队的首选。
四、"异步-多线程多进程"模型
这种模型的选择,都会使线程异步并发,每个线程之间使用消息队列进行通信,减少使用互斥锁(无共享资源时)。
现在的服务器都会采用多进程模型架构,将一个服务器分成多个服务器进行不同的功能处理,从而让服务器充分利用CPU承载更多的用户。但是,需要注意的是,大量的数据可能需要进行存储,数据存储是不能分成多进程进行的,如果不能及时同步内存数据,会造成严重的业务逻辑问题,加重存储进程的性能压力。而且多进程会造成运维和开发的困难,首先,整个服务系统的内部更加的复杂;其次,进程间通信需要准备更多的协议,单进程的下一个函数就可以解决的问题,在多进程中经常需要一套完整的请求和应答部分支持;另外,如果开发人员不了解整个体系的架构,不了解每个函数的功能和使用情况,代码的维护性会有严重的损失。
以上的四种模型,是我通过查找了大量的开发者的博客做的总结,可能总结的不够到位,欢迎指出问题。下一篇,我将会对服务器的内存架构进行整理。