8

假设我需要实现一个具有大量并发用户的 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安装在主机(入口点)。
  • 3 台机器之间的 Haproxy 负载平衡。它将流量转发到 4001 端口,即 node.js 进程正在监听 4001。
  • 每个 node.js 都有一个由 n 个进程组成的集群,监听 4001。

如果我是正确的,单个 http 请求将被转发到单个 node.js 进程。

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

4

3 回答 3

1

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

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

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

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

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

于 2016-03-10T03:57:00.983 回答
1

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

您还可以检查pm2功能列表,也许其中一些对您有用。

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

于 2015-10-13T13:40:56.183 回答
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 )
于 2016-03-10T04:13:22.957 回答