用Go语言开发一个大型MMORPG游戏服务器怎么样?

1.为什么golang的开发效率很高?

Golang是一种编译型强类型语言,开发的高效率主要来源于它的后发优势,不考虑老恶心的历史,它有更高的工程视角。它很好地避免了程序员为“{你需要独占一行吗?”,也解决了一些利用编译时间搭讪产品妹的阶级敌人。

它有自己的包管理机制,成熟的工具链,从开发、调试到发布都非常简单方便。

有大量的句法糖;例如反向接口、延迟和协同例程。

编译速度快,因为是带gc的强类型语言。只要是编制,非业务问题很少。

它在语法层面支持goroutine,这是大家谈论最多的内容,所以我在这里重点介绍一下。首先,协程并不罕见,语言无法超越硬件和操作系统实现惊人的功能。Golang可以做事,其他语言也可以,比如c++,在boost库中有自己的协程实现(当然用起来和其他boost库一样恶心)。golang所做的就是简化这一套东西的使用,提供一套通道的通信方式,让程序员可以忽略死锁等问题。

goroutine的目的是描述并发编程模型。并发不同于并行。它不需要多核硬件支持。它不是物理运行状态,而是程序逻辑流程。它的主要目的不是用多核来提高运行效率,而是提供一种更容易理解、更不容易出错的语言。

事实上,golang默认运行在单OS进程上,通过指定环境变量GOMAXPROCS,可以掉头运行在多OS进程上。有人提到网易的柚子。开源是一件非常好的事情,但是基于我对回调地狱的偏见,我一直都是抱着这样的态度:敢用nodejs写大型游戏服务器的,才是真正的勇士:)。

2.二郎和Golang的协程有什么区别?什么是协程?

Coroutine本质上是一个由语言开发者自己实现的线程,位于用户空间,在erlang和golang中都是如此。需要解决没有时钟中断的问题;当遇到阻塞i\o时,整个进程会被操作系统主动挂起;你需要有自己的调度控制能力(放在并行环境下还是挺麻烦的)等等。那为什么要浪费老板的精力做一套线程放在用户空间呢?

并发是服务器语言必须解决的问题;

系统空间的进程和线程调度太慢,占用空间太大。

把线程放在用户空间可以避免陷入上下文切换和缓存更新的系统调用,线程本身和切换操作都可以做得很轻。这就是golang等语言反复提到的超高并发,每分钟为你打开上千个线程并不难。

不同的是,golang的并发调度只发生在i/o容易阻塞的时候,这种情况通常是封装在库函数中的。Erlang甚至更夸张,为每个协程维护一个计数器。常见的语句会导致这个计数器减少,一旦到达该点,调度功能会立即切换。

中断干预的程度不同,使得erlang看起来有抢占式调度的能力,而golang是合作式调度。一旦golang写了一个纯计算无限循环,进程中的所有会话都会死;要有一个计算量大,i\o少的函数,就要调用runtime。Sched()主动切换调度。

3.golang的运营效率如何?

我对所谓的乒乓基准相当反感,运行效率需要在具体的工作环境下考虑。

首先不能比C快,毕竟它下面那么多工作,调度,gc。那为什么golang、nodejs、erlang在那些基准测试中,响应效率、响应速度、并发性似乎都那么优秀呢?强并发的原因上面已经提到了,响应快是因为大量的非阻塞I/O操作。c也可以做到这一点,而且能力更强,但是需要写很多高质量的代码。

然后,针对游戏服务器的高实时运行环境,GC带来的跳帧问题确实很麻烦。前大神@ Dada有更详细的论述和缓解方案,我就不赘述了。随着golang的不断发展,相信应该会有很大的提升。第一,屏蔽记忆操作是现代语言的大势所趋,必须实现;二是GC算法已经相当成熟,效率勉强过得去;第三,cpu消耗可以通过增量操作平均分摊。

用这一点点效率损失换取更高的产能值得吗?我觉得值得。硬件已经很便宜了,人生苦短。让你的生活轻松一点。

4.基于以上讨论,我认为用围棋小规模开发MMORPG是可行的。