是一个node.js应用程序,它既可以提供rest-api,也可以处理Web套接字是一个好主意?

Dag*_*der 6 api rest websocket node.js socket.io

免责声明:我是node.js的新手,所以如果这是一个奇怪的问题我很抱歉:)

我有一个node.js使用express.js来提供REST-API.REST-API提供的数据由node.js应用程序从nosql数据库中提取.所有客户端仅使用HTTP-GET.但有一个例外:数据是来自master数据库的PUT和DELETEd(另一个服务器上的关系数据库).这种设置的想法当然是让'node.js/nosql数据库'服务器成为公共前端,从而保护主数据库免受繁重的流量.

可能许多不同的客户端应用程序将使用REST-API,但主要是它将由具有较长生命周期(通常为0.5到2小时)的客户端应用程序使用.我没有让这个应用程序不断地轮询REST-API以寻找可能的新数据,而是希望使用websockets,以便在有任何新数据时只将数据发送到客户端.我将使用node.js应用程序,并且可能使用socket.io,以便在客户端不支持websockets时它可以回退到api-polling.每次nosql数据库中的主数据库PUT或DELETE对象时,都应将新数据发送到客户端.

问题是我是否应该为API和websockets使用一个node.js,或者为API使用一个node.js,为websockets使用一个.

需要考虑的事项: - 性能:应用程序将托管在服务器集群上,前面有负载均衡器和HTTP加速器.处理一切的应用程序是否会比具有不同任务的两个应用程序执 - 应用程序之间的流量:如果我选择一个两个应用程序解决方案,从主数据库接收PUT和DELETE的api应用程序每次收到新数据时都必须注意websocket应用程序(或主数据库必须注意两个应用程序).双倍流量是否会成为性能问题? - 代码清理:我相信两个应用程序将产生更清晰和更好的代码,但是再一次肯定会有两个应用程序的共同代码,这将导致它有两个副本.

至于负载有多重,很难说,但可能的峰值可能涉及:50000个客户端,每个监听多达5个不同的通道,从主站发送新数据,每5秒钟新数据应发送到大约25%客户端(对于某些数据,它应该发送到所有客户端,其他数据可能低于1%的客户端)

更新: 谢谢你们的答案.这里有更多的思想食物.我决定有两个node.js应用程序,一个用于REST-API,另一个用于Web套接字.原因是我相信它会更容易扩展它们.首先,整个系统将托管在三个物理服务器和一个node.js应用程序上,每个服务器上的REST-API应该足够,但对于websocket应用程序,可能需要在每个物理服务器上有几个实例.

小智 5

这个问题问得好。

如果您正在查看遗留系统,并且您已经定义了 REST 接口,那么添加 WebSockets 并没有太多优势。可能指向 WebSockets 的事情是: * 对服务器到客户端或客户端到客户端的实时数据的需求 * 需要使用经典的双向协议与服务器组件集成(例如,您想要用javascript编写FTP或sendmail客户端)。

如果您要开始一个新项目,我会尝试在项目中进行硬拆分:

  • 使用 HTTP 提供静态内容(图像、js、css)(这就是它的设计目的)和

  • 使用 WebSocket 提供动态内容(实时数据)(负载平衡、基于订阅/消息传递、启用自动重新连接以处理网络信号)。

那么,我们为什么要尝试硬分离呢?让我们考虑一下基于 HTTP 的 REST 协议的优势。

将 HTTP 协议用于 REST 语义是一项具有某些优点的发明 * 无状态交互:客户端的任何上下文都不会存储在请求之间的服务器端。* 可缓存:客户端可以缓存响应。* 分层系统:中介不可检测 * 易于测试:使用 curl 很容易测试基于 HTTP 的协议

另一方面...

在 WebSockets 之上使用消息传递协议(例如 AMQP、JMS/STOMP)并不排除这些优势中的任何一个。

  • WebSockets 可以透明地进行负载平衡,可以缓存消息和状态,可以定义高效的有状态或无状态交互。

  • 基本的反应式分析风格可以定义哪些事件触发客户端和服务器之间的哪些消息。

主要的附加优点是: * WebSocket 旨在成为长期持久连接,可用于通过单个连接进行多种不同的消息传递

  • WebSocket 连接允许完全双向通信,允许在符合网络特性的任一方向上发送数据。

  • 可以使用连接卸载来使用中介共享对常见主题的订阅。这意味着与核心消息代理的连接很少,您可以大规模高效地为数百万连接用户提供服务。

  • 监控和测试可以通过管理界面来实现,以发送/接收消息(与所有消息代理一起提供)。

  • 这一切的代价是当 WebSocket 被丢弃后需要重新连接时,需要重新建立状态。许多协议设计者构建了“同步”消息的概念,以提供从服务器到客户端的上下文。

无论哪种方式,无论您使用 REST 还是 WebSockets ,您的模型对象都可能相同,但这可能意味着您仍然在请求-响应方面考虑太多,而不是发布/订阅。