NodeJS水平扩展

10

我已经是一名Ruby/PHP Web应用程序开发者有一段时间了,我习惯于使用水平扩展服务器实例的思路来处理更多的请求。水平扩展是指将应用程序的单独实例放置在负载均衡器后面,这些实例之间没有共享和相互感知。

我的主要问题是,由于Node.js注重事件驱动的I/O,一个运行Node.js服务器的单个计算机可以处理“数千”个同时请求 - 是否使用负载均衡/水平扩展来扩展Node.js应用程序? Node应用程序的扩展是否仅限于垂直扩展(将更多的RAM /处理能力投入问题中)?

我的第二个问题与Node.js水平扩展和WebSockets有关。 我看到了很多Node.js“聊天”教程,都使用了WebSockets。 (推荐:http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial)

由于WebSockets在浏览器和服务器之间保持打开的通信线路,所以像上述链接中解释的聊天应用程序一样,典型的PHP / Ruby世界中的水平扩展架构是否会导致断开连接 - 因为新的WebSocket连接请求将分配给不同的进程/服务器,而没有一个中央资源来跟踪所有已连接的客户端?

3个回答

13

Node.js支持通过内置的 cluster 模块实现类似您描述的水平扩展。

关于您的第二个问题, 在这种环境下使用websockets/socket.io,您需要像这里描述的那样使用Redis来存储应用程序多个实例之间的共享状态。


这是一个老问题,但我正在使用mongodb来存储和检索所有我的聊天应用程序数据。由于我想要水平扩展我的应用程序,因为当我有多个服务器时,我的聊天应用程序无法正常工作。我该怎么办?我应该完全删除mongodb并使用redis吗?还是有更好的解决方案? - DragonBorn

2

Node.js的集群功能仅限于单个服务器,但可以利用服务器中的多个处理器。我认为问题更多地涉及到当我们想要通过负载均衡器外观在多个服务器上进行水平扩展的情况。


回答关于 socket 的问题,就像任何服务器调用一样,socket 创建调用将被负载均衡,并且到达节点 Nx,对于 Web Socket 的生命周期,此 TCP 连接保持打开状态。即浏览器与服务器之间所有通过 Web Socket 的通信始终由 Nx 提供服务。 - Pramma

0
如果您的 node.js 实例分布在多台服务器上(横向扩展),它将服务于相同的目的,您需要正确编程以支持这种类型的设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接