【问题标题】:Horizontal scaling with a node.js app & socket io使用 node.js 应用程序和套接字 io 进行水平缩放
【发布时间】:2020-01-18 07:01:55
【问题描述】:

我和我的团队正在开发一个数字标牌平台。

我们在全球有大约 2000 个 Raspberry Pi 使用 Socket IO 连接到 Nodejs 服务器。覆盆子正在启动连接。

我们希望能够在多台服务器上水平扩展我们的应用程序,但我们有一个无法解决的问题。

基本上,应用程序将连接的 Raspberry 的套接字存储在一个数组中。 我们有一个外部程序调用服务器内的 API,这是通过服务器搜索哪些套接字将被 API 调用“影响”并将信息发送给它们的结果。

经过大量搜索,我们假设我们必须将套接字(或它们的 ID)存储在其他地方(Redis ?),以使应用程序无状态。然后,任何服务器都可以响应 API 调用并在中心位置查看套接字。

很遗憾,我们找不到任何详细的示例来说明如何做到这一点。

你能帮帮我们吗?

谢谢

【问题讨论】:

  • 您的 node.js 服务器是否启动套接字 IO 连接,或者您的 RPis 上的软件是否启动? 从应用程序调用 API 路由 是什么意思?某些外部程序是否在您的 node.js 服务器中调用 API?请edit您的问题提供更多详细信息。
  • 是的,RPI 正在启动连接。是的,外部程序在我们的 nodejs 服务器中调用 API 已编辑后

标签: node.js redis socket.io high-availability


【解决方案1】:

(您不能将来自多个服务器实例的套接字存储在像 redis 这样的共享数据存储中:它们仅在启动它们的服务器的上下文中才有意义)。

您将需要一个 node.js 服务器集群来处理这个问题。有多种方法可以制作集群。它们都涉及将来自您的 RPis 的传入连接定向到“通用”主机名,例如 server.example.com。在 server.example.com 主机名后面将是多个 node.js 服务器。

每个 RPi 的每个传入连接都只连接到多个服务器中的一个。 (你知道这一点,我相信。)这意味着集群中的一个 node.js 服务器“拥有”每个单独的 RPi。

(告诉您如何安装 node.js 服务器集群超出了此答案的范围。提示:循环 DNS 或反向代理 nginx 前端。)

然后,您希望将来自每个 API 调用的传入数据路由到集群中的每个服务器,以便将其路由到它拥有的 RP。

这是一个很好的处理方法:

  1. 设置 redis 缓存或其他共享数据存储。它可以非常小。
  2. 当每个 node.js 服务器启动时,让它自己注册为活动的。也就是说,让它在共享服务器中放置自己的特定地址,用于处理 API 调用。具体地址大概是12.34.56.78:3000的形式:即IP地址和端口。
  3. 让每个服务器每隔一段时间(每分钟左右一次)更新该地址,以表明它仍然存在。
  4. 当 API 调用到达 server.example.com 时,它将到达或多或少随机选择的 node.js 服务器实例。
  5. 让该服务器从 redis 缓存中读取服务器地址列表
  6. 让该服务器对除自身之外的所有服务器重复 API 调用。将repeated=yes 之类的参数添加到重复的 API 调用中。
  7. 然后,每个服务器查看其连接的套接字列表并执行您的应用程序需要的操作。
  8. 在服务器关闭时,让服务器自行注销——从 redis 中删除其地址——如果可能的话。

换句话说,构建一种将 API 调用分散到集群中所有活动 node.js 服务器的方法。

如果这必须扩展到非常大的数量(超过一百个左右)node.js 服务器,或者每分钟数百个 API 调用,您可能应该使用消息队列软件进行调查。

保护您的 REDIS 服务器免受互联网上的随机网络入侵。

【讨论】:

  • 我们会用你的解释来解决我们的问题,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-25
  • 2021-03-12
  • 1970-01-01
  • 2012-04-27
  • 2020-01-13
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多