将 Nodejs 服务器扩展到多个系统?

Scaling Nodejs server to multiple systems?

我想使用 express.I 在 nodejs 中构建聊天服务器已经使用集群模块在多核之间扩展服务器,但如何扩展到不同的系统?

实际上这个问题可以有多个答案,因为答案取决于您希望如何在节点之间进行通信、如何将任务分配给节点以及如何管理故障。

您可能想研究其他集群管理器的工作方式,然后尝试在您的应用程序中设计类似的东西。

几种方法:

1) 在前端使用负载均衡器,在机器之间分配负载。我认为这是最简单的方法。

2) 使用像 RabbitMQ/ActiveMQ(或任何其他 AMQP)系统这样的消息系统进行节点间通信,并让主节点池将任务分配给特定节点并通过 AMQP 协议与节点通信.

如果你使用像 PM2 这样的进程管理器,它将负责在不同或相同的机器上启动你的节点应用程序,但要处理多台机器你应该研究一下Puppet、Chef 或 Ansible 可扩展。如果您使用的是 AWS,EC2 可以设置为自动执行。

由于 Node.js 不支持共享内存,在多台机器上分布 Node.js 进程提供了与使用集群在多个内核上分布进程相同的体验——如果您的应用程序可以 运行作为单个系统中的多个独立进程,那么它也可以作为跨多个系统的多个独立进程分布到运行。

太好了,这样就少了一件需要担心的事情!现在,有许多基础设施解决方案可以在多个系统上抽象 运行ning 集群,但您的应用程序不会注意到您可能选择的任何一个。

不过,在您的应用程序和任何单个进程的范围内,您会关心的是发现外部服务、跨基础架构与进程通信以及与集群内的进程通信。同样,有许多解决方案可以减少您的应用程序需要满足的任何特定要求。

到目前为止,Node.js 社区偏爱简单的方法,这些方法高度专门用于解决特定问题,然后让开。例如:

  • Web 套接字客户端和服务器:集群内的低延迟;当您只需发送一些数据并继续您的生活时,它也适用于整个网络,但如果您需要同步进程,例如发送一些数据,等待和空闲直到最终结果,它会使事情变得缓慢回来
  • Redis:集群易于设置,实例自行处理发现,足够的原子操作提供可靠的方法来在不同实例之间共享数据,发布-订阅支持提供低延迟IPC
  • ZMQ:因其智能、高可用性连接而受到称赞,您可以使用几十行代码设计任何消息协议,下一个维护您的应用程序的人将能够推理
  • etcd:分布式、一致的键值存储;低基础架构开销,允许在顶部实现直接的服务发现,这将与那里的每个基础架构解决方案很好地集成
  • Consul: based on serf,与 etcd 一样,但固执己见,提供了类固醇的服务发现以及许多额外的细节;如果你喜欢自己管理事情并且有时间预先投资,我衷心建议进一步调查

虽然这当然没有涵盖所有可用的选项,但它应该足以让您朝着正确的方向前进。仅凭这些非常容易推理的简单构建块,您应该能够跨多个系统分布您的应用程序,运行跨多个数据中心的多台机器。