go语言游戏服务器 go语言游戏服务器框架

为什么go语言适合开发网游服务器端前段时间在golang-China读到这个贴:
个人觉得golang十分适合进行网游服务器端开发 , 写下这篇文章总结一下 。
从网游的角度看:
要成功的运营一款网游 , 很大程度上依赖于玩家自发形成的社区 。只有玩家自发形成一个稳定的生态系统,游戏才能持续下去,避免鬼城的出现 。而这就需要多次大量导入用户,在同时在线用户量达到某个临界点的时候 , 才有可能完成 。因此,多人同时在线十分有必要 。
再来看网游的常见玩法,除了排行榜这类统计和数据汇总的功能外,基本没有需要大量CPU时间的应用 。以前的项目里,即时战斗产生的各种伤害计算对CPU的消耗也不大 。玩家要完成一次操作,需要通过客户端-服务器端-客户端这样一个来回,为了获得高响应速度,满足玩家体验 , 服务器端的处理也不能占用太多时间 。所以,每次请求对应的CPU占用是比较小的 。
网游的IO主要分两个方面,一个是网络IO , 一个是磁盘IO 。网络IO方面,可以分成美术资源的IO和游戏逻辑指令的IO,这里主要分析游戏逻辑的IO 。游戏逻辑的IO跟CPU占用的情况相似,每次请求的字节数很小,但由于多人同时在线,因此并发数相当高 。另外 , 地图信息的广播也会带来比较频繁的网络通信 。磁盘IO方面,主要是游戏数据的保存 。采用不同的数据库,会有比较大的区别 。以前的项目里,就经历了从MySQL转向MongoDB这种内存数据库的过程,磁盘IO不再是瓶颈 。总体来说 , 还是用内存做一级缓冲,避免大量小数据块读写的方案 。
针对网游的这些特点 , golang的语言特性十分适合开发游戏服务器端 。
首先,go语言提供goroutine机制作为原生的并发机制 。每个goroutine所需的内存很少,实际应用中可以启动大量的goroutine对并发连接进行响应 。goroutine与gevent中的greenlet很相像,遇到IO阻塞的时候,调度器就会自动切换到另一个goroutine执行,保证CPU不会因为IO而发生等待 。而goroutine与gevent相比,没有了python底层的GIL限制,就不需要利用多进程来榨取多核机器的性能了 。通过设置最大线程数,可以控制go所启动的线程,每个线程执行一个goroutine,让CPU满负载运行 。
同时,go语言为goroutine提供了独到的通信机制channel 。channel发生读写的时候,也会挂起当前操作channel的goroutine,是一种同步阻塞通信 。这样既达到了通信的目的,又实现同步,用CSP模型的观点看,并发模型就是通过一组进程和进程间的事件触发解决任务的 。虽然说 , 主流的编程语言之间,只要是图灵完备的,他们就都能实现相同的功能 。但go语言提供的这种协程间通信机制,十分优雅地揭示了协程通信的本质,避免了以往锁的显式使用带给程序员的心理负担,确是一大优势 。进行网游开发的程序员,可以将游戏逻辑按照单线程阻塞式的写,不需要额外考虑线程调度的问题,以及线程间数据依赖的问题 。因为,线程间的channel通信 , 已经表达了线程间的数据依赖关系了,而go的调度器会给予妥善的处理 。
另外,go语言提供的gc机制,以及对指针的保护式使用 , 可以大大减轻程序员的开发压力,提高开发效率 。
展望未来,我期待go语言社区能够提供更多的goroutine间的隔离机制 。个人十分推崇erlang社区的脆崩哲学 , 推动应用发生预期外行为时,尽早崩溃 , 再fork出新进程处理新的请求 。对于协程机制,需要由程序员保证执行的函数不会发生死循环,导致线程卡死 。如果能够定制goroutine所执行函数的最大CPU执行时间,及所能使用的最大内存空间,对于提升系统的鲁棒性,大有裨益 。
使用Go 语言开发大型 MMORPG 游戏服务器怎么样1.为什么golang的开发效率高?
golang是一编译型的强类型语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角 。良好的避免了程序员因为“ { 需不需要独占一行 ”这种革命问题打架 , 也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人 。
它有自己的包管理机制 , 工具链成熟 , 从开发、调试到发布都很简单方便;
有反向接口、defer、coroutine等大量的syntactic sugar;
编译速度快,因为是强类型语言又有gc,只要通过编译,非业务毛病就很少了;
它在语法级别上支持了goroutine,这是大家说到最多的内容 , 这里重点提一下 。首先,coroutine并不稀罕,语言并不能超越硬件、操作系统实现神乎其神的功能 。golang可以做到事情,其他语言也可以做到,譬如c,在boost库里面自己就有的coroutine实现(当然用起来跟其他boost库一样恶心) 。golang做的事情 , 是把这一套东西的使用过程简化了,并且提供了一套channel的通信模式,使得程序员可以忽略诸如死锁等问题 。
goroutine的目的是描述并发编程模型 。并发与并行不同,它并不需要多核的硬件支持,它不是一种物理运行状态,而是一种程序逻辑流程 。它的主要目的不是利用多核提高运行效率 , 而是提供一种更容易理解、不容易出错的语言来描述问题 。
实际上golang默认就是运行在单OS进程上面的,通过指定环境变量GOMAXPROCS才能转身跑在多OS进程上面 。有人提到了网易的pomelo , 开源本来是一件很不错的事情,但是基于自己对callback hell的偏见,我一直持有这种态度:敢用nodejs写大规模游戏服务器的人 , 都是真正的勇士 : )。
2、Erlang与Golang的coroutine有啥区别,coroutine是啥?
coroutine本质上是语言开发者自己实现的、处于user space内的线程,无论是erlang、还是golang都是这样 。需要解决没有时钟中断;碰着阻塞式i\o , 整个进程都会被操作系统主动挂起;需要自己拥有调度控制能力(放在并行环境下面还是挺麻烦的一件事)等等问题 。那为啥要废老大的劲自己做一套线程放user space里面呢?
并发是服务器语言必须要解决的问题;
system space的进程还有线程调度都太慢了、占用的空间也太大了 。
把线程放到user space的可以避免了陷入system call进行上下文切换以及高速缓冲更新,线程本身以及切换等操作可以做得非常的轻量 。这也就是golang这类语言反复提及的超高并发能力 , 分分钟给你开上几千个线程不费力 。
不同的是,golang的并发调度在i/o等易发阻塞的时候才会发生 , 一般是内封在库函数内;erlang则更夸张,对每个coroutine维持一个计数器,常用语句都会导致这个计数器进行reduction , 一旦到点,立即切换调度函数 。
中断介入程度的不同,导致erlang看上去拥有了preemptive scheduling的能力 , 而golang则是cooperative shceduling的 。golang一旦写出纯计算死循环,进程内所有会话必死无疑;要有大计算量少i\o的函数还得自己主动叫runtime.Sched()来进行调度切换 。
3、golang的运行效率怎么样?
我是相当反感所谓的ping\pong式benchmark,运行效率需要放到具体的工作环境下面考虑 。
首先 , 它再快也是快不过c的,毕竟底下做了那么多工作 , 又有调度,又有gc什么的 。那为什么在那些benchmark里面 , golang、nodejs、erlang的响应效率看上去那么优秀呢,响应快,并发强?并发能力强的原因上面已经提到了 , 响应快是因为大量非阻塞式i\o操作出现的原因 。这一点c也可以做到,并且能力更强,但是得多写不少优质代码 。
然后,针对游戏服务器这种高实时性的运行环境 , GC所造成的跳帧问题确实比较麻烦 , 前面的大神 @达达 有比较详细的论述和缓解方案,就不累述了。随着golang的持续开发,相信应该会有非常大的改进 。一是屏蔽内存操作是现代语言的大势所趋,它肯定是需要被实现的;二是GC算法已经相当的成熟,效率勉勉强强过得去;三是可以通过incremental的操作来均摊cpu消耗 。
用这一点点效率损失换取一个更高的生产能力是不是值得呢?我觉得是值得的 , 硬件已经很便宜了,人生苦短,让自己的生活更轻松一点吧: ) 。
4、基于以上的论述,我认为采用go进行小范围的MMORPG开发是可行的 。
origin游戏引擎go语言怎么样origin游戏引擎go语言好 。根据查询相关信息显示:origin是由Go语言编写的分布式开源游戏服务器引擎 , 适用于各类游戏服务器的开发,包括H5游戏服务器 。
Go语言是做什么的应用于搭建 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言 。
Go 是谷歌的编程语言,而不是社区的 。在这位博主看来,虽然 Go 语言拥有一个贡献者社区,但是它并不是社区的项目,只是谷歌的一个项目 。所以只要是谷歌反对的东西,没有人可以把这个东西加到 Go 语言中 。
InfoQ 采访人员也第一时间联系了《Go 并发编程实战》作者、前轻松筹大数据负责人郝林,他的观点是:Go 语言是大家的,只有伪爱好者才会谈舍弃 。在郝林看来,Go 语言官方团队在谷歌内部实属一个很小的团队 , 但其成员几乎个个都是技术大神 。
很多社区成员为 Go 语言贡献了很多重要并且有价值的东西,这些从贡献者和提交者的多样性就可以看出来 。但谷歌作为整个 Go 社区的守门人,它独自决定什么东西可以被 Go 语言接受 , 什么不能被接受 。
【go语言游戏服务器 go语言游戏服务器框架】在 Go 语言模块系统上发生的一件事情,谷歌 Go 语言核心团队的一名成员放弃了由外部 Go 社区开发的一个模块系统,因为它使用了另一种不同的模型 。Go 语言拥有一个贡献者社区,但是它并不是一个社区项目 。
关于go语言游戏服务器和go语言游戏服务器框架的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读