【发布时间】:2021-10-14 16:27:23
【问题描述】:
免责声明:我是 node.js 的新手,所以如果这是一个奇怪的问题,我很抱歉 :)
我有一个使用 express.js 来提供 REST-API 的 node.js。 REST-API 提供的数据由 node.js 应用程序从 nosql 数据库中获取。所有客户端仅使用 HTTP-GET。但是有一个例外:从主数据库(另一台服务器上的关系数据库)中 PUT 和 DELETEd 数据。 这种设置的想法当然是让“node.js/nosql 数据库”服务器成为公共前端,从而保护主数据库免受大量流量的影响。
可能会有许多不同的客户端应用程序使用 REST-API,但主要是由具有较长生命周期(通常为 0.5 到 2 小时)的客户端应用程序使用。我不想让这个应用程序不断地轮询 REST-API 以获取可能的新数据,而是使用 websockets,以便仅在有任何新数据时才将数据发送到客户端。我将为此使用 node.js 应用程序,并且可能使用 socket.io,以便如果客户端不支持 websockets,它可以回退到 api-polling。每次 master 数据库在 nosql 数据库中 PUTs 或 DELETEs 对象时,都应该向客户端发送新数据。
问题是我是否应该为 API 和 websockets 使用一个 node.js,或者一个用于 API 和一个用于 websockets。
需要考虑的事项: - 性能:应用程序将托管在具有负载平衡器和 HTTP 加速器的服务器集群上。一个处理所有事情的应用程序会比两个具有不同任务的应用程序执行得更好吗? - 应用程序之间的流量:如果我选择两个应用程序解决方案,则从主数据库接收 PUT 和 DELETE 的 api 应用程序每次接收新数据时都必须注意 websocket 应用程序(或者主数据库必须注意两个应用程序)。翻倍的流量会是性能问题吗? - 代码清理:我相信两个应用程序会产生更干净和更好的代码,但是这两个应用程序肯定会有一些共同的代码,这将导致有两个副本。
很难说负载有多大,但可能出现的峰值可能涉及: 50000个客户 每个收听多达 5 个不同的频道 每 5 秒从主设备发送新数据 新数据应发送给大约 25% 的客户端(对于某些数据,它应该发送给所有客户端,而其他数据可能低于 1% 的客户端)
更新: 谢谢你们的答案。这里有更多的思想食物。我决定拥有两个 node.js 应用程序,一个用于 REST-API,一个用于 Web 套接字。原因是我相信扩展它们会更容易。首先,整个系统将托管在三台物理服务器上,每台服务器上的一个用于 REST-API 的 node.js 应用程序应该足够了,但对于 websocket 应用程序,每个物理服务器上可能需要多个实例。
【问题讨论】:
-
webSockets 在集群中的工作量要大得多,因为您必须有一种跨服务器的方式来了解哪个服务器与给定用户建立了连接,以便您可以将数据推送给该用户。您的 REST 数据库内容应该易于集群,因为没有持久的 node.js 服务器状态。因此,不集群 webSocket 服务器会更容易实现(如果 webSocket 规模可以由单个服务器处理)。
标签: node.js api rest websocket socket.io