如何设计一个分布式的Node.js Web服务器

8
假设我需要实现一个具有高并发用户的Web应用程序。我决定使用node.js,因为它可以很好地扩展,性能良好,并且有开源社区等。然后,为了避免瓶颈,因为我可能会有数以亿计的用户在同一个事件循环中,我决定使用进程集群来利用多核CPU。此外,我有3台机器(主+ 2),因为我需要用Cassandra处理大数据。太棒了,这意味着我有3 * n个node.js进程,其中n是CPU核心数(机器是相同的)。
好的,然后我开始研究,最终得到以下架构: - Nginx监听端口80,仅用于提供静态内容(img、css、js等)。将动态流量转发到haproxy。我知道如何配置nginx,但我还需要看一下haproxy,所以我会说haproxy正在侦听端口4000。 - Nginx和haproxy都安装在主机器上(入口点)。 - Haproxy在3台机器之间进行负载平衡。它将流量转发到端口4001,即node.js进程正在侦听4001。 - 每个node.js进程都有一个n进程集群,正在侦听4001。
如果我没错的话,单个HTTP请求将被转发给单个node.js进程。
创建会话很正常,对吧?会话只是一个映射,这个映射是一个对象,这个对象存在于node.js进程中。Haproxy将使用轮询调度程序进行配置,因此同一用户可以被转发到不同的node.js进程。我如何跨所有node.js进程共享相同的会话对象?我如何共享全局对象(包括在同一台机器上(node.js集群)和跨网络)?我应该如何设计一个分布式Web应用程序,使用node.js?是否有任何模块简化了同步任务?

1
haproxy有多种处理粘性会话的方式,可以参考https://dev59.com/VGw15IYBdhLWcg3wntEQ。对于全局对象,可以使用redis或其他类似的工具。 - numbers1311407
类似于https://dev59.com/0W035IYBdhLWcg3wef5y,只需要3个服务器。 - Paul Verest
3个回答

1
你可以使用memcache或redis来存储会话对象。如果会话数据存储在进程的内存中,则在重新启动节点进程时将会丢失,这种方法非常有用。
另外,您可以查看pm2功能列表,也许其中一些功能对您有用。
构建微服务架构将实现良好的可扩展性。

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

所以,在开发过程中,您必须非常小心地选择技术和设计决策。

假设我需要实现一个具有高并发用户的Web应用程序。

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

在构建可扩展系统时的一个好的试金石是问自己,“是否存在单点故障?”如果是,则您的系统将无法扩展。


0

正如另一个用户建议的那样,使用 Redis 是解决这个问题完全可接受的方案。

要点是使用该服务来存储会话对象,并让中间件处理其他所有内容。如先前提到的,在节点进程重新启动、崩溃等情况下非常有用。在节点进程中存储会话数据具有风险。使用微服务(如Redis)的好处之一是可以减少这种风险。

假设您使用 Express 作为您的中间件,您可以使用称为 Session store 的东西。有很多模块利用了这个功能。

其中一个模块是 connect-redis

安装通常很容易:

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'
}))

现在您可以像平常一样使用会话对象 (req.session)。 示例: 要设置会话信息(例如来自表单POST):
req.session.email = req.body.email


获取会话信息:

console.log( req.session.email )

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