使用Go 语言开发大型 MMORPG 游戏服务器怎么样
我们开发的不是MMORPG, 但是规模不小, 纯Golang开发 从处理客户端连接, MySQL处理到跨服, 平台SDK对接都是使用Golang开发的之前我的C++服务器框架也是完善的, 但和Golang比起来, 总是有一些问题, 比如说:1 总是感觉C++写出来的服务器要结实一些, 因为有强大的IDE(我们是在Windows开发Linux下运行), 强大的调试器(VS) Golang虽然没有这些, 但LiteIDE本身已经足够强大,没有之一2 Golang性能调优很是方便, 性能, 内存和阻塞, 3个pdf生成节点图, 几下就能找出问题所在 C++在这点上必须用专业第三方收费工具以及自己多年的经验来分析, 很是麻烦3 Golang任何错误都可以捕捉, 跨平台运行, 尤其是Linux, 比C++稳定的多 不用担心哪天挂掉4 Golang的Socket, 让你能想起当年用C语言的阻塞Socket时代 可惜操作系统的线程不能跟goroutine同日而语5 Golang语言简单, 任何语言招来, 2~3天开始生产代码, 很简单, 用的人也舒心6 Golang的语言特性很好, 没有OO的冗余, 只有复合+接口的简洁 用习惯后, 都不敢去用C#的OO, 怕继承变化需要重构7 Golang 14比前面版本好很多, gc基本没啥大问题了 只是自举的编译器编译速度下降了不少 但问题不大8 Golang写服务器, 因为阻塞+同步逻辑, 所以还是得考虑各种线程同步问题 该加锁还是要加锁, 而不是一味都用channel+goroutine来实现 逼近channel本身是由多个锁来实现的9 Golang写tcp短连接不知道比C++简单上百倍吧, 比boostasio这些封装库也简单个10来倍http连接就更简单了, 啥都给你处理了, 只管收消息就是了10 至今为止, 坑就1个, interface{} 简直是双刃剑 因为没泛型, 所以用interface{}等同于void 如果用interface{}做了map的key, 恭喜你, 迟早有一天你会调的死去活来 还更别说interface{}与nil, 一把泪啊11 看有些写法喜欢在Golang服务器里嵌入脚本 我们的服务器也嵌入有otto的JavaScript引擎, 但只用来做服务器配置, 方便部署 但是没有把JavaScript拿来做逻辑 毕竟考虑各种线程安全问题 Lua最终我们还是放弃了, 没有C++那些绑定库, 纯api编写, 都不知道是在写逻辑还是在封api12 除了服务器以外, 我们还用Golang编写机器人, 电子表格数据导出等 13 Golang开发效率很高, 一般大的游戏功能, 22人一周3~4个整完 这换C++时代, 大概也就1~2个还写不完14 部署太方便了! 编译出来的可执行文件都是零依赖 直接丢到目标机器就可以运行, 没有虚拟机之类的东西
Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于需要很多程序员一起开发,并且开发周期较长的大型软件和支持云计算的网络服务。
Go语言融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性,不仅提高了项目的开发速度,而且后期维护起来也非常轻松。
编译器
当前有两个Go编译器分支,分别为官方编译器gc和gccgo。官方编译器在初期使用C写成,后用Go重写从而实现自举。Gccgo是一个使用标准GCC作为后端的Go编译器。
官方编译器支持跨平台编译(但不支持CGO),允许将源代码编译为可在目标系统、架构上执行的二进制文件。
1、服务器编程:以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
2、分布式系统、数据库代理器、中间件:例如Etcd。
3、网络编程:这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
4、开发云平台:目前国外很多云平台在采用Go开发,我们所熟知的七牛云、华为云等等都有使用Go进行开发并且开源的成型的产品。
5、区块链:目前有一种说法,技术从业人员把Go语言称作为区块链行业的开发语言。如果大家学习区块链技术的话,就会发现现在有很多很多的区块链的系统和应用都是采用Go进行开发的,比如ehtereum是目前知名度最大的公链,再比如fabric是目前最知名的联盟链,两者都有go语言的版本,且go-ehtereum还是以太坊官方推荐的版本。
自10版发布以来,go语言引起了众多开发者的关注,并得到了广泛的应用。go语言简单、高效、并发的特点吸引了许多传统的语言开发人员,其数量也在不断增加。
使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等。
后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。
羊了个羊服务器2天崩3次的原因是什么羊了个羊服务器为什么会2天崩3次羊了个羊是一款点击即玩的休闲小游戏,玩家可以在微信小程序或者抖音平台上直接搜索游玩,很多玩家在体验这款游戏的时候,遇到了服务器崩溃的情况,接下来就让我们一起去看看羊了个羊服务器2天崩3次的原因是什么吧。
羊了个羊服务器为什么会2天崩3次
1、“羊了个羊服务器2天崩3次”这个消息是从“羊了个羊”游戏的官方微博上传出来的,恐怕制作组当初也没想到这种小游戏居然会这么火,有点措手不及的样子。
最新消息:
由于游戏火爆程度超预期,目前《羊了个羊》官方在线急招后端服务器开发。官方称推荐入职的奖励五千,自荐入职的奖金五千”。官方表示招聘岗位为go服务器开发。
资料显示,Go是谷歌开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。语法接近C语言,但对于变量的声明有所不同。
Go语言由于其方便的并发通信机制以及强大的网络支持,常常被用于服务器软件的开发。
羊了个羊服务器以后还会继续崩吗
对于《羊了个羊》在线招人,有网友表示:这人都要现招的吗”、这是修不好急着招人了吗”等等。
鉴于“羊了个羊”游戏现招后端开发技术员的操作,可以看出官方似乎很难立刻解决服务器容易崩溃的问题,而且公司内部缺乏足够的技术支持,要知道招聘上岗也是要一定的流程与时间的,因此如果“羊了个羊”游戏热度依旧不减,搞不好后期服务器又会崩掉。
解决之道:在系统设计时,避免使用管道chan传递主业务数据,避免将业务流程处理流程分割到对个Go程中执行,这样做减少chan传输耗时,和Go程调度耗时,性能会有很大的提升。
案例分析:nsq和nats都是实时消息队列,nsq在客户端端和服务端大量使用chan转发消息,导致性能不佳,只有100,000/s;而nats服务端在分发消息流程中,没有使用chan,只在客户端接收时使用chan,性能可达到1,000,000/s。
个人觉得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出新进程处理新的请求。对于协程机制,需要由程序员保证执行的函数不会发生死循环,导致线程卡死。
0条评论