我第一次使用 Node.js 进行一个严肃的项目,构建一个多人纸牌游戏。我正在使用 socket.io 作为 websocket。游戏上线后,Node.js 服务器应全天候 (24/7) 运行。
目前,我有一些问题需要解决。为了清楚起见,我将它们分为下面两个子问题。
首先,每次出现错误时整个服务器都会崩溃。当然,我会在上线之前尝试消除所有错误,但如果我们能够避免在一款纸牌游戏的数据损坏时杀死整个服务器进程,那就太好了。例如,如果我引用一个对象的不存在元素,Node 当然会抛出错误。没问题,但是有没有办法防止此类事件导致服务器崩溃(除了确保这种事情一开始就不会发生)?
其次,游戏状态在游戏过程中存储在服务器上。因此,如果有 3 个游戏正在进行,则 Node 服务器上将会有 states[1]
、states[2]
和 states[3]
。当服务器崩溃时,我想以某种方式保留这些数据,以便服务器可以立即重新启动并恢复数据。我认为 Node 服务器上的 session 不是一个选项,因为它们(大概)会随着服务器一起消失,不是吗?将每个游戏操作的所有内容都存储到 MySQL 似乎是对资源的巨大浪费(如果我错了,请纠正我)。
这一切都归结为:如何确保服务器能够在任何潜在问题下自主运行而不会崩溃,如果必须崩溃,如何确保它不会影响所有正在进行的游戏?
最佳答案
如果错误的状态数据导致您的应用崩溃,那么在重新启动后重新加载它不会导致另一次崩溃吗?
在存储传入数据之前,无论是在内存中还是在数据库中,您都应该始终验证传入数据是否完全有效。
每当访问可能不存在的对象的属性时,请始终检查该对象是否存在。
if (state[n].obj && state[n].obj.prop == val) ...
就在进程外存储数据而言,您的应用程序听起来像是 Redis 等简单键值存储的良好候选者。如果将所有状态数据存储在 Redis 中,它将在 Node 重新启动后继续存在,并且性能仍然与进程内内存相似。它还为您带来了能够扩展到单个 Node 进程之外以处理重负载的好处。
关于node.js - 如何在 Node.js 服务器发生错误时保留数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22414655/