Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展我的nodejs应用程序的最佳方式是什么? 基础_Javascript_Node.js_Sockets_Scalability_Autoscaling - Fatal编程技术网

Javascript 扩展我的nodejs应用程序的最佳方式是什么? 基础

Javascript 扩展我的nodejs应用程序的最佳方式是什么? 基础,javascript,node.js,sockets,scalability,autoscaling,Javascript,Node.js,Sockets,Scalability,Autoscaling,现在,我和我的一些朋友正在尝试开发一款用nodejs制作的浏览器游戏。它是一款多人自上而下的射击游戏,大部分客户端和服务器端代码都是javascript。我们有一个很好的总体方向,我们想去,我们有很多的乐趣发展游戏。我们制作这个游戏的目标之一就是尽可能地避免作弊。做到这一点,我们就可以在服务器端处理所有的游戏逻辑。客户端只通过web套接字将其输入发送到服务器,服务器用游戏中发生的事情更新客户端(也是web套接字)。这是我们问题的开始 所有服务器端的计算都变得非常重要,我们发现我们需要以某种方式进

现在,我和我的一些朋友正在尝试开发一款用nodejs制作的浏览器游戏。它是一款多人自上而下的射击游戏,大部分客户端和服务器端代码都是javascript。我们有一个很好的总体方向,我们想去,我们有很多的乐趣发展游戏。我们制作这个游戏的目标之一就是尽可能地避免作弊。做到这一点,我们就可以在服务器端处理所有的游戏逻辑。客户端只通过web套接字将其输入发送到服务器,服务器用游戏中发生的事情更新客户端(也是web套接字)。这是我们问题的开始

所有服务器端的计算都变得非常重要,我们发现我们需要以某种方式进行扩展,以处理超过10名玩家(我们希望能够托管更多玩家)。起初我们认为我们可以根据需要垂直扩展,但由于nodejs是单线程的,所以is只能利用一个核心。这意味着获得一个更强大的服务器并不能解决这个问题。我们唯一的解决方案是水平扩展

我们为什么要问这个 我们还没有找到任何关于如何扩展nodejs游戏的好例子。我们的用例非常特殊,虽然我们自己已经尽了最大的努力,但我们确实可以从外部的意见和建议中获益

细节 我们已经在如何解决这个问题上花了很多心思。我们已经做了一个多星期了。以下是我们到目前为止总结的内容:

四种类型的服务器 我们将任务分为4种不同类型的服务器。每个人都有自己完成的特定任务

代理服务器 代理服务器将位于整个堆栈的前端,并且是唯一可以直接从internet访问的服务器(可能会有更多这样的服务器)。它上面会有haproxy,它会将所有连接路由到web服务器。我们选择haproxy是因为它丰富的功能集、可靠性和几乎无与伦比的速度

网络服务器 web服务器将接收web请求,并为所有web页面提供服务。他们还将处理大厅创建/管理和游戏创建/管理。要做到这一点,他们会告诉游戏服务器它有哪些大厅,大厅里有哪些用户,以及他们将要玩的游戏的信息。然后,web服务器将更新游戏服务器关于用户输入的信息,游戏服务器将更新web服务器(然后由web服务器更新客户端)关于游戏中发生的事情。web服务器将使用TCP套接字与游戏服务器就任何类型的管理进行通信,并在就游戏更新进行通信时使用UDP套接字。这一切都可以通过nodejs完成

游戏服务器 游戏服务器将处理所有关于游戏的游戏数学和变量更新。游戏服务器还与数据库服务器通信,以记录游戏中玩家的酷统计数据。这将通过nodejs完成

数据库服务器 数据库服务器将托管数据库。事实证明,这是我们发现以来最简单的部分,也是有史以来最酷的db。这很容易扩展,而且很奇怪,这是扩展应用程序最容易的部分

其他一些细节 如果你对我们的整个服装感到困惑,这是一个半精确的图表,显示了我们认为我们将如何缩放

如果你只是好奇,或者认为看看我们的游戏可能会有所帮助,它目前在这里的非缩放状态

一些我们不想要的东西
  • 我们不想使用nodejs的集群模块。它不稳定,而且不能扩展到其他服务器,只能扩展到其他处理器。我们只想跳到水平缩放
我们的问题,总结起来 我们希望我们的方向是正确的,我们已经完成了家庭作业,但我们不能确定。我们当然可以就如何以正确的方式做到这一点提供一些建议

谢谢 我意识到这是一个相当长的问题,做出一个深思熟虑的答案并不容易,但我会非常感激


谢谢

以下是我对你案件的自发想法:

多核使用 node.js还可以扩展到多个核心。如何,您可以阅读(或者只是想一想:您有一个线程/进程运行在一个核心上,您需要使用多个核心做什么?多个线程或多个进程。将工作从主线程推到其他线程或进程,您就完成了)

我个人认为开发一个不使用多核的应用程序是幼稚的。如果您使用一些后台进程,好吧,但是如果您到目前为止只在node.js主事件循环中工作,那么您肯定应该投入一些时间使应用程序在核心上可伸缩

顺便说一句,实现类似IPC的东西并不是那么容易。您可以这样做,但如果您的案例很复杂,那么您最好使用集群模块。这显然不是你的最爱,但仅仅因为有些东西被称为“实验性的”,并不意味着它是无用的。试一试,也许你甚至可以在途中修复模块的一些bug。对于复杂的问题,最好使用一些广泛使用的软件,而不是发明一个新的轮子

您还应该(如果尚未)考虑(明智地)使用
nextTick
功能。这允许主事件循环暂停一些cpu密集型任务,同时执行其他工作。你可以读到它

关于计算的一般性思考 你肯定应该仔细看看你的游戏引擎算法。你已经注意到这是你现在的瓶颈,实际上计算是大多数游戏中最关键的部分。缩放确实以一种方式解决了这个问题,但缩放带来了其他问题。此外,您不能将“缩放”作为所有问题的解决者,并期望所有问题都消失。