Node.js多线程多核多人游戏



我正在开发一款网络多人游戏。使用docker、node、数字海洋以及postgres和redis获取数据。我的docker机器有很多CPU,但node.js只使用一个CPU。正因为如此,我已经接近了这场比赛的规模。

我希望能够利用其他CPU。我听说和读到的一些方法是:

  • 使用子进程
  • 在一个液滴中运行多个节点服务器
  • 在不同的液滴中运行多个节点服务器

如果我能逃脱惩罚,我宁愿不运行更多的节点服务器。游戏结构有点像这样:

大厅(玩家信息,所有在线玩家等(房间(玩家数量有限(游戏(玩家数量有限,20-40万游戏时间(

大堂<=>房间=>游戏

我没有办法衡量(这里也可以接受建议(,但我猜大多数CPU使用量都来自单一游戏。我希望有一个解决方案,有点像保留Lobby&主线中的房间。而所有游戏都是在随机的不同线程中创建的,或者是在活动游戏数最少的线程中创建。

我预见到的一些可能的问题是消息和playerstate。一个玩家可以同时打开多个浏览器选项卡。这意味着单个玩家对象可以具有类似4个会话&插座连接。1个室内大厅,3个室内游戏。玩家可能想从游戏中向大厅内的玩家发送私人信息。此外,当游戏结束时,玩家状态将得到更新。

根据所有这些信息,我最好的方法是什么?任何文档、博客、链接、关键词、视频都将不胜感激。

这个问题的典型解决方案是使用Redis,听起来你已经在做了。这个想法是你把你的游戏服务器编程为";"无国籍";,这意味着所有的状态都存储在Redis中。

然后,您可以生成游戏服务器的N个实例,其中N等于VPS液滴上的CPU数量减去1。(让操作系统有1个CPU作为衡量标准。(

这是一个比使用NodeJS Web Workers干净得多的解决方案,因为您不必担心IPC和流程的生命周期。

此外,更新游戏服务器变得非常容易。在内部处理状态的服务器中,当您更新服务器时,您的用户必须停机,这意味着他们必须结束当前正在玩的任何游戏,以便您可以重新启动所有游戏。但是,如果所有状态都在Redis中,您可以简单地关闭所有实例并启动新实例,而不需要真正的停机时间。

您尝试过Web Workers吗?它们允许您在Node.js中使用线程,并且它们的API最终是稳定的。

你可以在Rich Trott的这篇博客文章中看到一些例子。

这里有一个最小的例子:

const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// This code is executed in the main thread and not in the worker.
// Create the worker.
const worker = new Worker(__filename);
// Listen for messages from the worker and print them.
worker.on('message', (msg) => { console.log(msg); });
} else {
// This code is executed in the worker and not in the main thread.
// Send a message to the main thread.
parentPort.postMessage('Hello world!');
}

相关内容

  • 没有找到相关文章

最新更新