如何设计分布式node.js web服务器
我需要实现一个拥有大量并发用户的web应用程序。我决定使用node.js,因为它具有很好的可扩展性、良好的性能、开源社区等。然后,为了避免瓶颈,因为在同一事件循环中可能会有无数用户,我决定使用进程集群来利用多核CPU。此外,我有3台机器(main+2),因为我需要用Cassandra处理大数据。太棒了,这意味着我有3*n node.js进程,其中n是cpu的核心数(机器是相同的) 好的,然后我开始一项研究,并以以下模式结束:如何设计分布式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
- Nginx在端口80上侦听,仅用于提供静态内容(img、css、js等)。
将动态流量转发给haproxy。我知道如何配置nginx,但我仍然需要看看haproxy,所以我要说haproxy正在监听端口4000。 Nginx和haproxy安装在主机(入口点)中 - 三台机器之间的Haproxy负载平衡。它将流量转发到端口4001,即node.js进程正在侦听4001
- 每个node.js都有一个由n个进程组成的集群,这些进程侦听4001
如何使用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 )