Articles of 群集计算

聊天/系统通讯应用程序(Nodejs + RabbitMQ)

所以我现在有一个运行NodeJS的聊天系统,通过兔子传递消息,每个连接的用户有自己的唯一队列订阅,只有听消息(只有他们)。 后端也可以使用这个聊天pipe道来传递其他系统消息,如通知/好友请求和其他用户事件驱动的信息。 目前,即使消息的有效载荷相同,比如说1000个用户,后端也必须循环发布每个消息1个用户。 我想摆脱这一点,并能够发送相同的消息给多个不同的用户,但不是每个连接的用户。 (例如:通知某些用户他们的朋友已经联机)。 我考虑实现一个兔子队列系统,在这个系统中,所有的消息被汇集到同一个队列中,而不是兔子发送所有的用户队列,节点接收这些消息,并通过套接字连接(向谁在线)发送消息给适当的用户。 build议 – 基础设施 这样后端不需要为100和1000的用户循环,并且可以发送包含这个消息应该去往的所有用户的单个有效载荷。 我打算将nodejs服务器集中在一起。 我也想知道,因为从来没有做过这样的生产环境,我需要跟踪每个socketID。 到目前为止,我已经发现了潜在的缺陷: 由于1000条消息可以堆积在一个队列中,因此速度较慢。 手动存储套接字ID以手动传送给用户。 将路由卸载到NodeJS而不是RabbitMQ 有没有人做过这样的事情? 如果是这样,你有什么build议。 使用用户唯一队列进行扩展还是比较好?或者将所有用户的所有分组消息汇集到较小(但较大的队列)的队列中。

将process.stdout设置为每个node.js核心集群工作者的文件

我正在尝试使用节点核心的集群function。 我想stdout和stderrstream输出到一个文件,每个工人ID一个。 非常像以下内容: var fs = require('fs'), env = process.env, workerId = env.NODE_WORKER_ID || env.NODE_UNIQUE_ID; process.stdout = fs.createWriteStream(__dirname + '/app#' + workerId + '.log', { encoding: 'utf8' }); 不幸的是,似乎没有像这样重写process.stdout。 有没有办法做到这一点,还是应该这样做是不同的? 目前,当我运行我的集群时,我在一个控制台中获取所有进程的所有输出,这非常混乱。

Node.js Cluster + Express总是调用同一个worker

我正在尝试使用群集模块来处理与Express同时多个http请求。 通过下面的代码,我可以产生多个工作人员,并让他们都在同一个端口上进行监听。 大的for循环是模拟Web服务器上的重负载。 我想看到的是,如果工作人员在第二个请求进入时正忙于处理一个http请求,则会调用另一个worker并处理该第二个请求。 相反,当我尝试使用curl发出多个请求时,所有请求都由一个工作人员顺序处理; 即使他们已经分叉,也没有其他的工人被调用过。 难道是我使用Express不正确? 提前致谢! var cluster = require('cluster'); if (cluster.isMaster) { var cpuCount = require('os').cpus().length; for (var i = 0; i < cpuCount; i += 1) { cluster.fork(); } } else { var http = require('http'), app = require('express')(); http.createServer(app).listen(31415, function () { console.log(process.pid + " listening on 31415"); }); app.get('/', […]

kue以“群集”模式多次处理预定作业

我已经设置了kue来运行Cluster模块,该模块为每个CPU核心提供了一个kue的subprocess。 当调度程序插入every键到redis时,一切似乎都是按顺序的 – every运行只有一个键集。 但是,当触发作业处理的时间到来时,所有subprocess(工作者)开始处理处理逻辑,这导致作业具有由单个“调度程序”条目触发的多个实例。 当以编程方式触发kue的新作业时,似乎不会发生此症状,使用kue API时也不会发生这种情况。 请指教。 主引导代码 var cluster = require('cluster'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { require('./init.js'); for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('online', function (worker) { console.log('Worker ' + worker.process.pid + ' is online'); }); cluster.on('exit', function (worker, code, signal) { console.log('Worker ' + […]

使用cluster和node-webworker构build高性能的node.js应用程序

我不是一个node.js主,所以我想对此有更多的观点。 我正在创build一个HTTP node.js Web服务器,它不仅能处理大量的并发连接,还能处理长时间运行的作业。 默认情况下,node.js在一个进程上运行,如果有一段代码需要很长时间才能执行任何后续连接,则必须等到代码结束之前连接的操作。 例如: var http = require('http'); http.createServer(function (req, res) { doSomething(); // This takes a long time to execute // Return a response }).listen(1337, "127.0.0.1"); 所以我想使用node-webworker库在单独的线程中运行所有长时间运行的作业: var http = require('http'); var sys = require('sys'); var Worker = require('webworker'); http.createServer(function (req, res) { var w = new Worker('doSomething.js'); // This takes a […]

如何在使用集群模块的Node.js应用程序中运行Cron Job?

我正在使用Node-cron模块来调度Node.js应用程序中的任务。 我也希望在使用核心集群模块的几个进程中运行应用程序。 在几个进程中运行应用程序最终将在每个进程中执行计划任务(例如,如果任务是发送电子邮件,则会多次发送电子邮件)。 与群集模块一起运行cron作业的最佳实践/可行方法是什么? 我应该创build一个单独的进程,只处理cron作业,不接受任何请求。 如果是的话,我怎样才能以正确的方式做到这一点?

如何正常重启NodeJS服务器?

目前,我的一个侧面项目的产品环境是一个git仓库,在这里我拉入一些代码,用Ctrl-C手工杀死服务器,然后手动重新启动。 我意识到这有很多错误的东西。 比如,如果一个用户还在做重要的事情,而且这个过程正在处理敏感数据,那么我又杀了谁? 当我使用节点v0.4.x时,有一个很好的集群模块可以在应用处于完全状态时正常重启服务器。 在v0.6.x中,集群模块被内置到节点中,但它确实是裸露的,并且没有优雅的重启能力。 任何人都知道我可以在v0.6.x中正常重启nodejs服务器吗?