Articles of 可扩展性

如何将数据写入MongoDB和Redis,但只能通过Sails.js从Redis读取数据

我正在创build一个使用sails.js作为后端的应用程序,并正在考虑使用这种数据存储/检索方法: – 数据保存在Redis和Mongo DB中 – 数据仅从Redis中读取 – 当服务器重新启动/重置从MongoDB的数据写入到Redis,所以在任何时候这两个数据库实际上是相同的。 在这种情况下,我拥有持久性和速度。 这是我的问题: – 这是不是一个好主意? 我了解同时使用RAM和HDD的含义。 – 这可以很容易地获得在帆? 写两个,从一个阅读? – 这会为像QuizUp这样的游戏提供高可扩展性解决scheme吗? (比方说1000万用户)。 在这种情况下,我的可伸缩性解决scheme将部署到Heroku / Beanstalk / Azure的应用程序,并自动扩展计算能力,并在不同的计算机上具有Mongo DB和Redis集群。 谢谢阅读!

如何在restify上缩放socket.io?

我正在尝试缩放运行restify的socket.io。 我能够将其设置为在一个nodejs实例上运行良好。 现在,当我将应用扩展到四个实例时,应用生态系统崩溃了(即客户端之间的事件没有正确同步)。 我正在寻找关于如何设置restify的粘性会话的例子。 或者,现在怎么样? Sticky会话的更新是在一年前: Socket 1.0更新/可伸缩性 。 我发现这两个博客设置这个,但他们都使用快递,也写了一年多前: 第1条 第二条 由于我正在制作一个无头API,所以我认为Express不应该被使用。 这是推荐的思维方式还是我应该使用Express? package.json: "dependencies": { "hiredis": "^0.4.1", "pouchdb": "^4.0.3", "pouchdb-upsert": "^1.1.3", "redis": "^2.0.1", "restify": "^4.0.0", "socket.io": "^1.3.7" } 任何帮助,将不胜感激!

如何devise一个分布式的node.js web服务器

Supose我需要实现一个Web应用程序,将有大量的并发用户。 我决定使用node.js,因为它扩展得非常好,性能良好,开源社区等等。为了避免瓶颈,我可以在同一个事件循环中使用用户,我决定使用一个簇进程利用多核CPU。 此外,我有3台机器(main + 2),因为我需要使用Cassandra来处理大数据。 真棒,这意味着我有3 * n node.js进程,其中n是CPU的核心数(机器是相同的)。 好吧,然后我开始研究,我以下面的模式结束: Nginx监听端口80,只用于静态内容(img,css,js等)。 将dynamicstream量转发给haproxy。 我知道如何configurationnginx,但我仍然需要看看haproxy,所以我会说,haproxy正在监听端口4000. Nginx和haproxy安装在主机(入口点)。 3台机器之间的Haproxy负载平衡。 它将stream量转发到端口4001,即node.js进程正在侦听4001。 每个node.js都有一个包含n个进程的集群,监听4001。 如果我是正确的,单个http请求将被转发到单个node.js进程。 创build一个会话是很正常的,对吧? 一个会话只是一个地图,而这个地图是一个Object,而这个Object住在一个node.js进程中。 Haproxy将configuration一个循环调度程序,所以同一个用户可以被转发到不同的node.js进程。 如何跨所有node.js进程共享相同的会话对象? 我如何共享一个全局对象(这包括在同一台机器(node.js集群)和整个networking中)? 我应该如何devise一个带有node.js的分布式Web应用程序? 有没有任何模块,缓解同步任务?

计算跨水平服务器的socket.io用户

我有多个使用redisstore水平缩放的socket.io服务器。 我已经有效地设置了房间,并且能够成功地通过服务器等向房间进行广播。现在,我正在尝试构build一个状态页面,而我没有弄清楚的是如何简单地统计连接的用户数量所有服务器。 io.sockets.clients('room')和io.sockets.sockets将只告诉你在一台服务器上连接的客户端数量,而不是连接到同一个RedisStore的所有服务器数量。 build议? 谢谢。

Node.js是否应该用于密集处理?

比方说,我正在构build一个三层的网站,在后端使用Mongo DB,而在浏览器中使用一些非常轻量级的javascript(比如说,只是对表单进行validation,也许是一些引发AJAX请求的奇特控件)。 我需要为“中间”层select一种技术(我们可以将其分成多个子层,但是这个细节不是这里的重点,只是整个技术的select),在那里我要closures一些原始数据DB,并将其渲染为一些我推送到浏览器的HTML。 一个相当典型的瘦客户端Web架构。 我的安全select是在Java中实现这个中间层,使用像Jongo这样的库来与Mongo DB交谈,也许Jackson可以编组/解组JSON,以便在他们发出AJAX请求时与我的控件交谈。 还有一些用于在服务器上呈现我的HTML的模板框架。 不过,我真的很想把所有的东西都抛出窗口,并且在这个中间层使用Node.js,原因如下: 我喜欢javascript(好的部分),让我们说这个应用程序的业务逻辑比Java更具有performance力。 它的JavaScript到处都是。 在堆栈上的任何位置工作时,无需在语言之间进行切换,实际上也可以使用OO和function范例。 层之间没有翻译pipe道,JSON在本地无处不在。 我可以在客户端和服务器上重新使用validation逻辑。 如果将来我决定在浏览器中执行HTML渲染客户端,那么我可以重用现有的模板,像Backbone一样,只需要很less的重构/重新testing工作。 如果你现在和Node一样,上面的所有内容都显得很明显。 所以我应该select节点吧? 但是…这是我所知道的:我们都知道Node是基于单线程的asynchronousI / O Web服务器模型的。 这对于我的数据服务请求方面的可伸缩性和性能来说非常好,但是我的业务逻辑呢? 那么我的模板渲染呢? 这些东西是不是会对单线程的所有请求造成巨大的瓶颈? 想到两个明显的解决scheme,但他们都不对: 将“阻塞”业务逻辑保留在那里,只需使用一组Node实例和一个负载平衡器,即可真正并行地处理请求。 好,那么为什么Node不是multithreading呢? 还是总是这样做的想法,保持简单愚蠢,并避免在基本情况下的multithreading复杂性的可能性,使程序员做多余的安装工作,如果多核心处理能力的期望? 保持单个节点实例,并通过调用某个其他multithreading应用程序服务器上运行的业务逻辑的某个java实现来保持它不阻塞。 好的,这个选项完全无效了我列出的使用Node的每一个亲(事实上它比仅仅使用Java增加了复杂性),除了CRUD请求到数据库的性能和可伸缩性可能的增益外。 这导致我终于到了我的问题的重点 – 我错过了Node的一个巨大的重要难题,我刚刚得到了我的事实完全错误,或者是Node不适合在服务器上处理业务逻辑? 换句话说,Node对于坐在一个数据库上是否有用,并且以比其他一些阻塞I / O的实现更高性能和可扩展的方式服务于许多CRUD请求? 而且你必须在下面的某个层次,甚至是客户端做所有的业务逻辑,以保持合理的性能和可扩展性。 考虑到所有关于Node的嗡嗡声,我宁愿希望它带来更多的东西。 我很乐意相信!

如何扩展一个NodeJS有状态的应用程序

我目前正在开发一个基于networking的MMORPG游戏,并且想要build立一个基于Docker和DigitalOcean飞沫的自动缩放策略。 但是,我想知道如何做到这一点: 我的游戏服务器必须在不同的Docker容器之间进行拆分, 但是每个游戏服务器实例都应该像只有一个巨大的游戏服务器那样工作。 这意味着每个修改(angular色移动)都应该在每个其他游戏服务器上进行镜像。 我试图让这个工作(至less在概念上),但无法find一种方法来正确同步我的所有实例。 我应该使用只有广播事件的主人还是有其他select? 我想知道关于我的MySQL数据库的同样的事情:因为每个游戏服务器都必须从db读取/写入数据库,那么随着游戏变得越来越大,我怎样才能使它正确地扩展? 我能想到的最好的解决scheme是将数据库保存在一台function非常强大的服务器上。 我明白,如果所有的游戏服务器都不需要“分享”他们的状态,这可能很容易,但这主要是为了让我可以快速扩展,以防万一突然激增的活动。 (将有不同的“全球”游戏服务器,如A,B,C …但是这些全球游戏服务器中的每一个应该在幕后由运行“真实”游戏服务器的1-Xdocker容器组成, “全球”游戏服务器只是一个概念)

可扩展的Node.js应用程序架构

过去,我只在本地机器上玩过Node.js,所以我只有单进程Node.js应用程序的经验。 现在我想创build一个Web应用程序,我可以在网上发布。 这个networking应用程序就像多人游戏 – 使用Socket.IO进行客户端 – 服务器通信,使用Express处理HTTP请求,使用Grunt进行任务pipe理等等 – 我还想使用其他NPM软件包以执行各种任务。 我想devise这个应用程序的体系结构 启用横向可伸缩性(后来,当我有很多访问者,我不必重写整个应用程序) 最大限度地减less对不同执行环境的依赖(最大化可移植性) 我怎样才能实现这个使用节点? 我想高级架构将包括: 不同的服务器进程 (每个进程将运行一个Express实例并处理传入的HTTP请求)。 应该有一个负载平衡器的地方。 可选: 后台进程可以定期运行并处理“共享数据” 由于我的应用程序是一个多人应用程序,每个用户都可以与其他在线用户交互,所以我应该在某个地方存储一些可以在这些进程之间共享的共同状态 (“共享数据”)。 为了简单起见,起初我不必坚持这个共享数据,所以我想我应该使用像Redis这样的内存数据存储。 大图像看起来像这样: 这个devise提出了一些问题: 如何产生过程? 我应该使用Node的child_process还是cluster模块并手动启动工作进程? 顺便说一句,是否有可能手动启动这些,例如,如果我的应用程序部署到Heroku或Nodejitsu ? 或者: is there a better way to store these information in a config file? 我的意思是,如果我可以configuration多less个服务器实例,而不是编辑代码而是一个configuration条目,会更好。 系统边界? 如果我手动产生进程,那么(我猜)所有进程都会在同一个(虚拟)服务器上运行。 如果这个服务器有4个CPU内核,那么你最多可以产生4个Node实例,因为如果你产生了更多的CPU,你的CPU将会产生上下文切换,这会损害整体性能。 如果我需要更多的stream程实例,我该怎么办? 假设我需要100个服务器实例。 我必须将我的应用程序部署到25台服务器,并在每台服务器上产生4个进程? 在我看来,像Nodejitsu这样的主机服务以某种方式隐藏了你的这个系统边界层,但我不明白它在实践中是如何工作的。 特别是有这个“共享数据”提供者组件。 我想这个提供者(比如一个Redis服务器)必须运行在不同的服务器上,这样它才能被所有进程使用。 但在这种情况下,很容易成为瓶颈,不是吗? 负载平衡器? 如果我使用一些托pipe服务,我必须自己设置负载均衡器层吗? […]

SocketIO缩放架构和大型机房要求

我们在一个大型聊天应用程序上使用socketIO。 在某些情况下,我们希望向所有其他用户发送“状态”(用户可用性)。 io.in('room1').emit('availability:update', {userid='xxx', isAvailable: false}); room1可能包含很多用户(最多500个)。 当许多可用性更新被触发时,我们观察到NodeJS负载的显着提升。 这个想法是使用与Socket IO类似的Redis存储。 让Web浏览器客户端连接到不同的NodeJS服务器。 当我们想要发射到一个房间时,我们使用Redis PubSub ZeroMQ甚至RabbitMQ将“发射到房间1”的有效载荷分配给所有其他的NodeJS进程。 每个进程都会自己调用他自己的io.in('room1').emit 。 对这种设置的关注之一是进程间的通信可能变得相当繁忙,我想知道它是否会在未来成为一个问题。 这是我想到的架构。