欢迎来到阿里云授权服务中心典名科技有限公司!咨询电话:023-66887777 18623333330

微信
手机版
网站地图

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

2021-11-08 09:52:47 投稿人 : admin 围观 : 243 次 0 评论

  网游服务器租用商提供的服务器从几百元到上万元的都有,所以在这里要提醒用户朋友们在选择时千万不要被价格所左右,主要看两点就行了,一是看用户你这个网游的规模的大小,二是网游的竞争情况。玩家规模的大小主要从网游服务器配置和带宽两个方面来考虑。当然如果配置越高,服务器性能当然也就越好,不用说其价格相差也越大;带宽是影响用户体验的最重要的一个因素,带宽的价格也随着大小、独享和共享、地区而不同。下面就由和大家讲一讲网游服务器和Web服务器的区别。

  一、Go语言的特点

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

  Go语言的设计理念围绕着简洁这两个字,认为少即是多。如果你熟悉Java,用Java那一套语法命名跟Go做对比,可以很明显的体会到这种感觉。

  Go的特点可以简单的概括成以下几个点。

  1、静态类型和编译型

  首先Go是静态类型,静态类型就是编译时就知道每一个变量的类型,得益于此,在编译的阶段就能够发现很多问题。而如果是动态语言,例如JavaScript,有些问题直到运行时才能发现。

  Go是编译型语言,看到编译型大家脑子里可能会想到另外一个词解释型。两者的区别从字面上来理解其实已经可以看出来,我用一个简单的例子来类比一下。

  编译型 去餐馆吃饭,点了菜之后,饭店会等所有的菜做好了再上

  解释型 去餐馆吃饭,点了菜之后,陆陆续续的边吃边上

  2、跨平台

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

  这点其实很好理解,例如Java的口号是"Write once, run anywhere"。我们都知道Java是编译型的语言,但是Java在编译的时候生成的是字节码,这个字节码与当前的操作系统无关,与CPU也无关。

  这种字节码必须依赖Java虚拟机才能运行,而虚拟机会将操作系统和CPU之间的差异与用户屏蔽。对于编程的人来说这个过程其实无感知的。而对Java来说,语言本身的跨平台并不能代表代码可以跨平台。

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

  3、自动垃圾回收

  与JVM一样,Go在运行时的内存管理(GC)由Go语言本身来管理,不需要程序员的参与,但是我们可以干预。

  4、原生的并发编程

  何为原生?我们都知道,在Java中如果要实现并发, 需要外部的类库支持(Thread),而Go不需要从外部再引入任何依赖。支持使用关键字go即可。而且Java中是通过共享内存进行通信的,熟悉Go的应该都看过一句话“不要通过共享内存来通信,而应该通过通信来共享内存”

  二、用Go的优势

  先说一下我对Go语言的看法,我认为Go在服务器这块是非常有优势的。以后如果有高并发的应用场景,那么大概率这个服务就是用Go写的。不知道大家有没有发现,摩尔定律正在失效。近十年内,硬件的原始处理能力都没有太大的提升。显然,一味的增加晶体管的数量已经不是解决问题最好的方法。

  NASA前不久发布到官网然后又迅速删掉的文章透露了,Google可能已经实现了量子霸权,通俗一点说就是拥有超越所有传统计算机的计算能力。而放置更多的晶体管的代价也越来越高,所以现在厂商都在向处理器中添加更多的内核来提升性能。

  就像大家熟悉的Java,虽然Java本身支持多线程,但是在Java上使用多线程编程代码算是比较昂贵的。在Java中创建一个新的线程就会消耗接近1M左右的内存。假如你真的需要支持运行上千个线程,那么服务很可能运行着就OOM了。除了内存消耗外,还会存在由于支持多线程带来的并发和死锁等问题。

  而Go中,使用协程来代替线程。而且一个协程所消耗的内存比线程少了很多倍。同样的物理设备限制,你可能只能启动最多几千个线程,而协程能够启动上百万个。而且不同的Goroutine可以通过信channel进行安全的通信。

未标题-1.jpg


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


  有些对游戏服务器的介绍可能会说,游戏服务器是一个需要长期运行的程序,然后怎么怎么样。我个人认为Web服务器一样的需要长期运行,也需要响应不定点不定时来自用户的请求。两者从宏观上来看其实没有本质的区别。同时Web服务器也会对于稳定性和性能有要求,游戏服一般分为大小服,我们这里都按照小服举例子。

  1、状态

  首先要提到的就是状态。可能你会听说过一个概念,游戏服务器是有状态的,而Web服务器是无状态的。什么意思呢?Web服务器的数据流大多直接会到数据库中。而游戏服务器的数据流首先会到内存中,然后定期的写入数据库(落地)。

  换句话说,游戏服务器本身的数据与数据库中的数据在运行期间会存在一个数据不一致的窗口。如果此时游戏服务器宕机了,那么就会造成数据首先到的内存数据与数据库存的数据不一致。

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

  2、扩容

  在Web服务器中,如果你不能评估一个服务所面临的压力,又不想因为瞬时的热点访问导致服务直接不可用的话,完全可以设置成自动扩容,因为每个服务只是单纯的接收请求,然后处理请求、返回结果,不会将数据保存在服务器的内存中。要有数据存到内存,那也是在Redis中。而Redis数据丢失对数据的一致性基本没有影响。

  但是在游戏服务器这边很难做到像Web那样灵活。首先,数据的流向不是数据库,而是内存。

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

  3、稳定

  就像上面说的例子,如果游戏服务器运行中出了BUG,导致服务直接不可用,或者说通过这个BUG刷到了大量的道具,将是一个非常严重的线上事故。

  而对于Web服务器来说,如果是管理系统之类的,有可能会有脏数据值得一提的是,脏数据对于Web来说,排查起来也是一件很头疼的事情。如果没有脏数据,只是服务暂且不可用,而且如果用的是微服务架构,重启服务的代价是相对来说比较小的,只有正在重启的服务的业务是不可用的,其余的部分则可以正常的访问。

  而对于游戏服务器来说,服务器重启影响的是全服的玩家。玩家在停服期间,甚至连游戏都进不了,特别的影响玩家体验。而且,如果停服之前服务器的数据落地出现了问题,服务重启之后会将数据从数据库load到内存中,此时同样会造成数据不一致的问题。

  4、性能

  从我的经验来看,在做Web服务器的时候,没有为了减少GC的压力,为了少占用内存去做过多的优化。当然这是因为项目本身的体量不大,如果QPS很高的话,Web服务器同样很需要注重性能,只不过游戏服务器需要一直特别注意这个方面。

  不过在Web,如果访问量很大的话导致单个服务不能扛住压力,大部分人首先想到的解决方案应该就是搞多个实例,毕竟可以做到很轻松的横向扩展。

版权声明:本站部分文章内容、图片来源于网友推荐、互联网收集整理而来,仅供大家学习参考,不代表本站立场,如有侵权,请联系站长,我们会第一时间处理!本站原创内容未经允许不得转载,或转载时需注明出处:典名科技资讯门户

相关文章

  • linux如何查看文件夹什么时候创建的
    linux如何查看文件夹什么时候创建的

    这篇文章主要介绍“linux如何查看文件夹什么时候创建的”,在日常操作中,相信很多人在linux如何查看文件夹什么时候创建的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux如何查看文件夹什么时候创建的...

    2022-05-23 13:46:59
  • linux中rz和sz命令不能用怎么解决
    linux中rz和sz命令不能用怎么解决

    本文小编为大家详细介绍“linux中rz和sz命令不能用怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中rz和sz命令不能用怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。解决方法:1、...

    2022-05-23 13:46:59
  • linux为什么会产生zombie
    linux为什么会产生zombie

    这篇文章主要介绍了linux为什么会产生zombie的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux为什么会产生zombie文章都会有所收获,下面我们一起来看看吧。linux产生zombie(僵尸进程)...

    2022-05-23 13:46:58
  • linux中unzip找不到命令怎么解决
    linux中unzip找不到命令怎么解决

    这篇文章主要讲解了“linux中unzip找不到命令怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中unzip找不到命令怎么解决”吧!解决方法:1、利用“yum list...

    2022-05-23 13:46:56
  • linux中grep如何查找不包含
    linux中grep如何查找不包含

    今天小编给大家分享一下linux中grep如何查找不包含的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在linux中,可以利...

    2022-05-23 13:46:56
  • linux中h文件指的是什么
    linux中h文件指的是什么

    这篇文章主要介绍“linux中h文件指的是什么”,在日常操作中,相信很多人在linux中h文件指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中h文件指的是什么”的疑惑有所帮助!接下来,请跟...

    2022-05-23 13:46:55
  • linux如何查询mysql的用户
    linux如何查询mysql的用户

    这篇文章主要介绍“linux如何查询mysql的用户”,在日常操作中,相信很多人在linux如何查询mysql的用户问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux如何查询mysql的用户”的疑惑有所...

    2022-05-23 13:46:55
  • linux中awk和sed有哪些区别
    linux中awk和sed有哪些区别

    这篇文章主要讲解了“linux中awk和sed有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中awk和sed有哪些区别”吧!linux中awk和sed的区别:1、sed是...

    2022-05-23 13:46:55
  • linux中fork和exec有哪些区别
    linux中fork和exec有哪些区别

    这篇文章主要介绍“linux中fork和exec有哪些区别”,在日常操作中,相信很多人在linux中fork和exec有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中fork和exec有哪...

    2022-05-23 13:46:54
  • linux中有没有access函数
    linux中有没有access函数

    这篇“linux中有没有access函数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux中有没有access函数”文...

    2022-05-23 13:46:53
发表评论