当前位置: 首页 > 知识库问答 >
问题:

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

元景天
2023-03-14

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

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

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

如果我是正确的,那么单个http请求将被转发到单个节点。js流程。

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

共有3个答案

邴修远
2023-03-14

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

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

假设您将Express用于中间件,则可以使用名为会话存储。有许多模块可以利用此功能。

其中一个模块是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

< br >要检索会话信息:

console.log( req.session.email )
曾光誉
2023-03-14

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

所以你必须非常小心你选择的技术和你在开发过程中做出的设计决策。

因此,我需要实现一个将具有大量并发用户的Web应用程序。

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

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

施琦
2023-03-14

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

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

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

 类似资料:
  • 主要内容:1.RPC流水线工程,2.RPC 技术选型,3.如何设计 RPC1.RPC流水线工程 ① Client以本地调用的方式调用服务 ② Client Stub接收到调用后,把服务调用相关信息组装成需要网络传输的消息体,并找到服务地址(host:port),对消息进行编码后交给Connector进行发送 ③ Connector通过网络通道发送消息给Acceptor ④ Acceptor接收到消息后交给Server Stub ⑤ Server Stub对消息进行解码,

  • 主要内容:一、从一个新闻门户网站案例引入,二、推算一下你需要分析多少条数据?,三、黄金搭档:分布式存储+分布式计算这篇文章聊一个话题:什么是分布式计算系统? 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词,比如分布式服务框架,分布式系统,分布式存储系统,分布式消息系统。 但是有些经验尚浅的同学,可能都很容易被这些名词给搞晕。所以这篇文章就对“分布式计算系统”这个概念做一个科普类的分析。 如果你要理解啥是分布式计算,就必须先得理解啥是分布式存储,现在我们从一个小例子来引入。 比如说

  • 1977年,Apple 计算机公司使个人计算(personal computer)得以普及。最初拥有一台计算机只是爱好者的梦想,随着它的价格不断降低,人们可以购买供个人或办公使用的计算机。1981年,世界上最大的计算机广家IBM公司推出了IBM个人计算机(IBM Personal computer)。一夜之间,个人计算机遍布公司、企业和政府机关。 然而这些计算机只是“独立”的个体,各自做自己的工作

  • 主要内容:1、Master-Slave架构,2、异步日志持久化机制,3、检查点机制:定时持久化全量数据,4、引入检查点节点,5、总结 & 思考这篇文章,给大家来聊一个生产级的中间件系统的架构设计实践,希望给对中间件系统感兴趣的同学一点启发。 1、Master-Slave架构 这个中间件系统的本质是希望能够用分布式的方式来处理一些数据,但是具体的作用涉及到核心技术,所以这里不能直接说明。 但是他的核心思想,就是把数据分发到很多台机器上来处理,然后需要有一台机器来控制N多台机器的分布式处理,大概如下

  • 主要内容:一、从一个新闻门户网站案例引入,二、推算一下你需要分析多少条数据?,三、黄金搭档:分布式存储+分布式计算这篇文章聊一个话题:什么是分布式计算系统? 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词,比如分布式服务框架,分布式系统,分布式存储系统,分布式消息系统。 但是有些经验尚浅的同学,可能都很容易被这些名词给搞晕。所以这篇文章就对“分布式计算系统”这个概念做一个科普类的分析。 如果你要理解啥是分布式计算,就必须先得理解啥是分布式存储,现在我们从一个小例子来引入。 比如说

  • 问题内容: 您将使用哪种分布式锁定服务? 要求是: 可以从不同的进程/机器看到的互斥(锁定) 锁定…释放语义 超时后自动释放锁-如果锁持有人死亡,它将在X秒后自动释放 Java实现 很高兴拥有:.Net实现 如果免费:死锁检测/缓解 易于部署,请参阅下面的注释。 我对诸如“可以通过数据库完成”或“可以通过JavaSpaces完成”之类的答案不感兴趣-我知道。我对现成的,现成的,经过验证的实现感兴趣