如何设计分布式node.js web服务器

如何设计分布式node.js web服务器,node.js,scalability,distributed,multicore,Node.js,Scalability,Distributed,Multicore,我需要实现一个拥有大量并发用户的web应用程序。我决定使用node.js,因为它具有很好的可扩展性、良好的性能、开源社区等。然后,为了避免瓶颈,因为在同一事件循环中可能会有无数用户,我决定使用进程集群来利用多核CPU。此外,我有3台机器(main+2),因为我需要用Cassandra处理大数据。太棒了,这意味着我有3*n node.js进程,其中n是cpu的核心数(机器是相同的) 好的,然后我开始一项研究,并以以下模式结束: Nginx在端口80上侦听,仅用于提供静态内容(img、css、js

我需要实现一个拥有大量并发用户的web应用程序。我决定使用node.js,因为它具有很好的可扩展性、良好的性能、开源社区等。然后,为了避免瓶颈,因为在同一事件循环中可能会有无数用户,我决定使用进程集群来利用多核CPU。此外,我有3台机器(main+2),因为我需要用Cassandra处理大数据。太棒了,这意味着我有3*n node.js进程,其中n是cpu的核心数(机器是相同的)

好的,然后我开始一项研究,并以以下模式结束:

  • Nginx在端口80上侦听,仅用于提供静态内容(img、css、js等)。
    将动态流量转发给haproxy。我知道如何配置nginx,但我仍然需要看看haproxy,所以我要说haproxy正在监听端口4000。 Nginx和haproxy安装在主机(入口点)中
  • 三台机器之间的Haproxy负载平衡。它将流量转发到端口4001,即node.js进程正在侦听4001
  • 每个node.js都有一个由n个进程组成的集群,这些进程侦听4001
如果我是正确的,一个http请求将被转发到一个node.js进程

创建会话是很正常的,对吗?会话只是一个映射,该映射是一个对象,该对象位于node.js进程中。Haproxy将配置一个循环调度程序,因此相同的用户可以转发到不同的node.js进程。如何在所有node.js进程中共享相同的会话对象?如何共享全局对象(包括在同一台机器(node.js集群)中以及跨网络共享)?
如何使用node.js设计分布式web应用程序?是否有任何模块可以简化同步任务?

您可以使用memcache或redis来存储会话对象。它在重启节点进程时非常有用(如果会话数据存储在进程的内存中,它将丢失)

此外,您还可以查看功能列表,其中一些功能可能对您有用


构建微服务体系结构将具有良好的可扩展性。

正如Ivan指出的,您可以将会话对象存储在memcache或redis甚至Couchbase(memcache bucket)中。我还想补充一点,如果您想构建一个可扩展的系统,您的目标应该是以一种可以线性扩展的方式构建系统,以根据需求增加吞吐量。我的意思是,您应该能够在任何时候(最好是在高峰期)将更多主机添加到基础架构中的不同层,以满足需求

因此,在开发过程中,您必须非常小心地选择什么技术以及做出什么样的设计决策

我需要实现一个拥有大量并发用户的web应用程序

我想补充的另一件事是,如果你不能测量它,你就无法管理它。一个好的开始是定义“大量并发用户”对您意味着什么?这是facebook还是whatsApp类型的卷/并发?首先通过与您的利益相关者(如果有)合作来定义这些,然后您可以开始制定设计决策和选择技术


在构建可伸缩系统时,一个很好的试金石测试就是问问自己,“是否存在单点故障?”如果是,那么您的系统将无法伸缩

如另一位用户所建议;对于这个问题,使用是完全可以接受的解决方案

它的本质是使用服务来存储会话对象,并让中间件处理所有其他事情。如前所述,它在节点进程重新启动、崩溃等情况下非常有用。在节点进程中存储会话数据会带来风险。使用微服务(如Redis)的好处之一是降低了风险

假设您对中间件使用
Express
,您可以使用一种称为
会话存储的东西。有许多模块利用了此功能

其中一个模块是

安装和往常一样轻松:

npm install connect-redis express-session

那么您可以这样使用它:

var session = require('express-session')
var RedisStore = require('connect-redis')(session)

app.use(session({
    store: new RedisStore(options),
    secret: 'keyboard cat'
}))
现在,您可以像平常一样使用会话对象。(
请求会话


示例:

要设置会话信息(例如,从表单帖子):


要检索会话信息:

console.log( req.session.email )

haproxy有多种处理粘性会话的方法。对于一个全局对象,使用redis或其他类似的东西。类似于3台服务器。
console.log( req.session.email )