Warm tip: This article is reproduced from serverfault.com, please click

node.js-在不同主机上的Web服务器之间共享对象的最佳方法是什么

(node.js - Whats the best way to share objects between webservers on different hosts)

发布于 2020-12-10 16:12:43

TLDR;我想知道在n台机器上的n台网络服务器之间可靠地共享对象或其他数据的最佳方法是什么?

我已经看过redis之类的东西,但是看来这并不是我在这里真正寻找的东西。我现在在想,通过远程/ RPC进行IPC之类的方法可能更合适?有没有更好的方法来执行此操作,因为它将在30秒的时间间隔内至少调用10次,并且随着运行服务器的用户数量的增加,它也会呈指数增长。

示例和当前用例:

我为一个流量不错的游戏运行了一个多人游戏mod,我们开始注意到有时请求被丢弃的情况。后端Web服务器是用NodeJS编写的,并且在两个地方也使用了express。我们正在重组系统,现在我们开始重组系统的一部分,该部分处理来自公共主机成员的每台服务器的心跳。然后,此信息将共享给玩家,以便他们决定要加入哪个服务器。

根据我自己的研究,我希望将服务托管在几台不同的计算机上以实现冗余。然后,这些计算机通过vlan / vswitch链接,以便它们具有安全的相互通信方法。数据库系统已经设置为可以这种方式复制,但是我看不到一种性能倾斜的方式来处理对象的共享,该对象包含有关与每个Web主机通信的服务器的信息。

如果它有助于系统工作,则如下所示:

Users server -> my load balancer -> webhost (backend).

Player -> my load balancer -> webhost (backend) returns info on all currently online servers.

在上面的示例中,当前正在使用的是一个单实例Web服务器,用于处理所需的请求和流程。

Questioner
Titch2000
Viewed
0
21.4k 2020-12-11 00:42:02

社区提出答案时,这只是一个想法:考虑阅读有关Apache Thrift的内容。它不是像IPC之类的,而是一个RPC之类的。如果服务器的体系结构,不同的组件或“后端网络”位于“星型”中,而只有一个“主”,我应该考虑这种可能性。

如果你的后端架构不是这样的……而是一组“独立”实体,那么我想到可以通过一些“数据总线”来解决该功能,例如私有MQTT经纪人和一组已订阅或已订阅的成员。发布网络其余部分的数据。我认为该对象的最佳序列化策略是Google Protobuf。

Mqtt与nodeJS的集成非常简单,并且如果数据包的重量不太大,并且你可以允许一些延迟,我真的建议你使用发布/订阅QoS = 2的Mqtt进行一些测试。替换你正在使用的基础通信库并不需要付出很大的努力。

话虽如此,似乎还有另一种解决方案:Kafka,这似乎非常有趣(我不太了解)。

你的选择将取决于数据的性质,主要取决于:数据包的重量,每个用户的频率以及在最坏的情况下你愿意接受的延迟。