游戏服务器和Web服务器的区别

  • 时间:
  • 浏览:0
  • 来源:大发彩神下载—大发彩神APP

Go是编译型语言,看完编译型让当我们脑子里已经 会想到另外另一个多词解释型。两者的区别从字面上来理解觉得已经 都不不 看出来,我用另一个多简单的例子来比喻一下。

Go语言跟其他的语言类式Java比起来,算得上一门很年轻的语言。Go语言是由Robert Griesemer、Rob Pike和Ken Thompson于807年在Google开发。并于809年正式发布。

而对于Web服务器来说,已经 是管理系统类式的,有已经 会有脏数据值得一提的是,脏数据对于Web来说,排查起来也是一件很头疼的事情。已经 这么脏数据,也不服务从不不可用,已经 已经 用的是微服务架构,重启服务的代价是相对来说比较小的,还都都都可以 不不 正在重启的服务的业务是不可用的,其余的要素则都不不 正常的访问。

Go的跨平台从一种方面来说,与Java类型,让当我们不不 安装与当前操作系统相对应版本的Go。编译出来的可执行文件会根据操作系统的不同而有所不同。

这人 字节码不不 依赖Java虚拟机不不 运行,而虚拟已经 将操作系统和CPU之间的差异与用户屏蔽。对于编程的人来说这人 过程觉得无感知的。而对Java来说,语言一种的跨平台从还都都都可以 代表代码都不不 跨平台。

而对于Web来说,服务器的稳定性同样很糙要。不然根据业务的不同,造成后果的严重性都是已经 不同。影响了用户体验,就会直接影响到产品的口碑。

PS:这里仅拿SLG手游举例子

首先Go是静态类型,静态类型也不编译时就知道每另一个多变量的类型,得益于此,在编译的阶段就不不 发现统统难题。而已经 是动态语言,类式JavaScript,其他难题直到运行时不不 发现。

而Web服务器则不不有曾经的难题,Web所有的数据状况总要落地,已经 都不不 针对操作换成事务,不不担心已经 操作失败而引入脏数据。正已经 有了状况的约束,游戏服务器就会很慎重的使用内存、CPU。以求在资源有限的状况下,最大化的提高的承载量,已经 降低服务延迟。当然,Web服务器会为了降低某个接口的响应时间而去做对应的优化。

在Web服务器中,已经 你还都都都可以 评估另一个多服务所面临的压力,又要我已经 瞬时的热点访问意味服务直接不可用语录,完统统不不 设置成自动扩容,已经 每个服务也不单纯的接收请求,已经 出理 请求、返回结果,不不将数据保存在服务器的内存中。要有数据存到内存,那也是在Redis中。而Redis数据丢失对数据的一致性基本这么影响。

统统,对于另一个多游戏服务器,所能使用的内存和CPU的资源是非常有限的,不像Web服务器都不不 不不花很大的代价做到横向扩展。这也也不为那些游戏服务器会十分十分的注重代码的性能以及稳定性。

再举另一个多很极端的例子,点击商店,玩家要准备氪金了。已经 却发现进不了商店,都是已经 还都都都可以 获取商品列表。那些会直接影响到游戏的体验,甚至收入。

而对于游戏服务器来说,服务器重启影响的是全服的玩家。玩家在停服期间,甚至连游戏都进不了,很糙的影响玩家体验。已经 ,已经 停服已经 服务器的数据落地再次出先了难题,服务重启过还会将数据从数据库load到内存中,此时同样会造成数据不一致的难题。

何为原生?让当我们都知道,在Java中已经 要实现并发, 不不 组织组织结构的类库支持(Thread),而Go不不不 从组织组织结构再引入任何依赖。支持使用关键字go即可。已经 Java中是通过共享内存进行通信的,熟悉Go的应该看完完语录“从不通过共享内存来通信,而应该通过通信来共享内存”

其他对游戏服务器的介绍已经 会说,游戏服务器是另一个多不不 长期运行的守护程序运行运行,已经 缘何缘何样。我自己认为Web服务器一样的不不 长期运行,也不需要 响应不定点不定时来自用户的请求。两者从宏观上来看觉得这么本质的区别。一起Web服务器也会对于稳定性和性能有要求,游戏服一般分为大小服,让当我们这里都按照小服举例子。

这点觉得很好理解,类式Java的口号是"Write once, run anywhere"。让当我们都知道Java是编译型的语言,已经 Java在编译的已经 生成的是字节码,这人 字节码与当前的操作系统无关,与CPU也无关。

已经 在游戏服务器这边没能做到像Web那样灵活。首先,数据的流向都是数据库,也不内存。

这人 点上来说,我认为是两者都很关注的另一个多重点。只不过,在游戏服务器的其他状况中,已经 服务器抛出异常已经 panic。其造成的后果会被游戏特殊的环境放大。

换句话说,游戏服务器一种的数据与数据库中的数据在运行期间会存在另一个多数据不一致的窗口。已经 此时游戏服务器宕机了,这么就会造成数据首先到的内存数据与数据库存的数据不一致。

目前主流的编程范式有命令式编程、函数式编程和让当我们最熟悉的面向对象编程。在编写Go的代码的已经 ,让当我们都不不 选者使用面向对象的最好的最好的法子,也都不不 使用函数式编程的思想,相互结合,相辅相成。

Go语言的设计理念围绕着简洁这另一个多字,认为少即是多。已经 你熟悉Java,用Java那一套语法命名跟Go做对比,都不不 很明显的体会到这人 感觉。

类式,召回你的在组织组织结构队失败了,这么部队就会无缘无故在外面且不可用。这跟在浏览器中点另一个多按钮这么反应比起来,影响相对较小。已经 使用微服务架构,在修复难题已经 都不不 以很低的成曾经重启对应的服务,而游戏服务器中不不 修复一次数据。

就像顶端说的例子,已经 游戏服务器运行中出了BUG,意味服务直接不可用,已经 说通过这人 BUG刷到了絮状的道具,将是另一个多非常严重的线上事故。

熟悉Web的都知道,数据传输格式是JSON。而在游戏服务器中是Protobuf,是由Google开发的数据传输格式,与JSON类式。Protobuf是二进制的,二进制数据量会比JSON更小其他。已经 ,已经 传输的字段是空值,就不不被传输。而JSON已经 是空值,一样的也会被传输。

而Go中,使用协程来代替守护程序运行运行。已经 另一个多协程所消耗的内存比守护程序运行运行少了统统倍。同样的物理设备限制,你已经 还都都都可以 不不 启动最多几千个守护程序运行运行,而协程不不 启动上百万个。已经 不同的Goroutine都不不 通过信channel进行安全的通信。

无论是在那些样的环境中,举个例子,Node.js和Java中,Protobuf的性能表现都比JSON好。在Java中,Protobuf甚至要比JSON快了接近80%。已经 Java的服务之间通信有了性能瓶颈, 都不不 考虑服务之间使用RPC来通信。

首没能提到的也不状况。已经 我能 听说过另一个多概念,游戏服务器是有状况的,而Web服务器是无状况的。那些意思呢?Web服务器的数据流大多直接会到数据库中。而游戏服务器的数据流首先会到内存中,已经 定期的写入数据库(落地)。

在游戏服务器里,会把服务器的资源看的相当的宝贵。类式,能不落地的字段就绝对从不落地,某个字段的值都不不 通过已知的条件算出来的,就尽量从不定义在代码里。不过这也要看具体状况权衡运算量和调用的频率。已经 上线已经 ,已经 遇到了数据不一致,维护的数据越少,修复数据的难度就越小。

已经 凡事都具有两面性。Protobuf的缺点仍然存在:

用Go语言写游戏服务器都是另另一个多月了,也不不 明显的感受到两者的区别。这篇文章也不想具体的聊聊其中的区别。当然,在了解区别之间,让当我们先简单的了解一下Go语言一种。

就像让当我们熟悉的Java,觉得Java一种支持多守护程序运行运行,已经 在Java上使用多守护程序运行运行编程代码算是比较昂贵的。在Java中创建另一个多新的守护程序运行运行就会消耗接近1M左右的内存。已经 我我你真的不不 支持运行上千个守护程序运行运行,这么服务很已经 运行着就OOM了。除了内存消耗外,总要存在已经 支持多守护程序运行运行带来的并发和死锁等难题。

从获取、编译、测试、安装、运行和分析等一系列流程都是自己的内置工具。类式获取都不不 使用go get命令来下载更新指定的代码包,已经 对它们进行编译和安装,都不不 使用go build 对源码进行编译,用go run命令来运行Go的守护程序运行运行,用go fmt来快速格式化代码,统一代码风格。

不过在Web,已经 访问量很大语录意味单个服务还都都都可以 扛住压力,大要素人首先想到的出理 方案应该也不搞多个实例,毕竟都不不 做到很轻松的横向扩展。

从我的经验来看,在做Web服务器的已经 ,这么为了减少GC的压力,为了少占用内存去做过多的优化。当然这是已经 项目一种的体量不大,已经 QPS很高语录,Web服务器同样很不不 注重性能,只不过游戏服务器不不 无缘无故很糙注意这人 方面。

以上也不这另一个多月以来,总结的两者的区别。也不从大体上做了另一个多对比,并这么具体深入细节。细节语录有已经 会在已经 单独的来介绍。

与JVM一样,Go在运行时的内存管理(GC)由Go语言一种来管理,不不不 守护程序运行运行员的参与,已经 让当我们都不不 干预。

举个很简单的例子,玩家的主城被攻打着火了,已经 有了自动扩容,很有已经 在落地的窗口内,玩家再请求一次,请求到了曾经实例。主城又这么着火了。已经 数据总要先存在内存中。

使用Go的内置工具go fmt即可快速的将代码格式化成官方统一的标准,以此来达到代码风格统一的目的。甚至都不不 用golangci-lint来检测你的语法跟内置的标准语法算是有冲突,完统统不不 将这人 检测工具挂在git的钩子上,以此来达到强制的代码风格统一的目的。

类式,在Go顶端也都不不 用接口来描述行为,也都不不 使用纯函数来出理 再次出先副作用。已经 ,多范式编程也不指这人 语言支持多种编程范式的。

还有另一个多很糙要的特点是,国内的Go的社区十分的活跃,这对于Go在国内的普及起到了很大的作用。

Go的特点都不不 简单的概括成以下多少点。

NASA前不久发布到官网已经 又这么快删掉的文章透露了,Google已经 已经 实现了量子霸权,通俗其他说也不拥有超越所有传统计算机的计算能力。而放置更多的晶体管的代价也这么高,统统现在厂商都是向出理 器中换成更多的内核来提升性能。

再举另一个多例子,玩家氪金买了另一个多礼包。已经 退出游戏,落地窗口内再次上线什么都这么。这就都是单纯的数据难题了,玩家这是花了真金白银买的道具,无缘无故就什么都这么,另一个多还好出理 ,已经 多个玩家都再次出先曾经的难题,那这就属于严重的线上事故了。修复数据的工作量十分的大。

顾名思义,你写的Go源码在所有的系统都不不 运行。

先说一下我对Go语言的看法,我认为Go在服务器这块是非常有优势的。已经 已经 有高并发的应用场景,这么共要 率这人 服务也不用Go写的。我也不知道让当我们有这么发现,摩尔定律正在失效。近十年内,硬件的原始出理 能力都这么过多的提升。显然,一味的增加晶体管的数量已经 都是出理 难题最好的最好的最好的法子。