- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我将尝试总结一下我最近学到的所有关于 Node 配置的知识。如果正确请确认。如果我搞砸了,请纠正我和其他人。
Node.js 是一个服务器。作为服务器,它可以接收来自客户端的请求。假设一段时间内有 200 个请求。
由于 node.js 是单线程,它可以通过一个单元/一个内核处理所有这些请求。
然而,node 也是事件非阻塞 i/o,这意味着有人可以请求 node.js API 中的某些方法,需要 1 分钟才能完成,而其他人可以请求另一种方法,也需要 1 分钟才能完成。两者可以同时处理,无需等待对方完成。
现在这听起来很棒,但如果我们协助 Node 服务器并让它作为代理将 200 个请求的那些任务分配给集群/工作人员,它甚至会更好。因此, Node 服务器成为客户端和工作人员之间的代理。就像项目经理:)
这样做的好处是,我们现在有 4 个核心处理这些请求,而不是一个核心处理 200 个请求,每个核心都是事件非阻塞 i/o(当然取决于服务器规范)。
那可能 super 快。不是吗?
这是问题/我想了解的内容:
如何让这些集群/worker 共享工作?
我的意思是,如果 50 个请求转移到核心 1,50 个请求转移到核心 2,依此类推,直到所有可用的核心都可用,如何将套接字发送到两个不同的内核? (socket.io
)
集群如何与速率限制器一起运行?我的意思是,速率限制器将禁止试图发送垃圾邮件或其他内容的用户,但随后立即撤销对该用户的禁止,因为它进入了不同的集群。
我听说 Redis
应该对此提供帮助。但它非常令人困惑,redis 是一个 DB 不是吗?我正在使用 MongoDB,为什么我需要更多数据库?
我会在这里放一些代码,也许解决方案就在眼前:
var cluster = require('cluster');
var redis = require("socket.io-redis");
if(cluster.isMaster) {
var numWorkers = require('os').cpus().length;
console.log('Master cluster setting up ' + numWorkers + ' workers...');
for(var i = 0; i < numWorkers; 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 ' + worker.process.pid + ' stopped with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
cluster.fork();
});
cluster.fork();
} else {
// define main required variables
var express = require('express');
var app = express();
var cors = require('cors');
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var mongojs = require('mongojs');
var db = mongojs("mongodb://user:pass*@ip:port/dbname", []);
var ObjectId = require('mongodb').ObjectID;
var CronJob = require('cron').CronJob;
var request = require('request');
var fcm = require('./routes/fcm');
var Excel = require('exceljs');
var fs = require('fs');
var path = require('path');
var rateLimit = require('express-rate-limit');
// define some global limiter against spammer
var limiter = new rateLimit({
windowMs: 10*60*1000, // 10 minutes
max: 100, // limit each IP to 100 requests per windowMs (11 is on load and more 100 later on)
delayMs: 0, // disable delaying - full speed until the max limit is reached
message: "Service is block for you, try again later"
});
// apply to all requests
app.use(limiter);
// allow cross origin to access my api
app.use(cors());
var bodyParser = require('body-parser');
app.use(bodyParser.json()); // support json encoded bodies
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
app.use(express.static(__dirname + '/src'));
// my own routes
require('./routes/sockets')(app, io, mongojs, db, ObjectId, CronJob, request, fcm);
require('./routes/userServer')(app, io, mongojs, db, ObjectId, CronJob, request, fcm, rateLimit);
require('./routes/ridesServer')(app, io, mongojs, db, ObjectId, CronJob, request);
require('./routes/offersServer')(app, io, mongojs, db, ObjectId, CronJob, request, rateLimit);
require('./routes/notificationsServer')(app, io, mongojs, db, ObjectId, CronJob, request);
require('./routes/scopeServer')(app, io, mongojs, db, ObjectId, CronJob, request, fcm);
require('./routes/excelServer')(app, io, mongojs, db, ObjectId, CronJob, request, fcm, Excel, fs, path);
// listen
server.listen("8080", function() {
console.log("Connected to db and listening on port 8080");
});
}
如何处理这些事情?
谢谢。
最佳答案
我已经找到了解决方案,这里是:
对于具有多个集群的 socket.io 执行此操作:
第 1 步: 在您的机器上安装 Redis:brew install redis
第 2 步:运行 Redis 服务器:redis-server
(从 SHELL 中的新选项卡)。
第 3 步: 安装 Redis 依赖项:npm install redis --save
第 4 步:在定义 io
之后包含 Redis 适配器,如下所示:
var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
你准备好了。
使用Redis的限速器请关注下一个NPM Repo
关于javascript - node.js 集群、redis、单线程和非阻塞 i/o 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48616956/
此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。 struct foo { foo(int a) { s[0] = '0'+a%10;s[1]
我想要一个图表,其中有一个单线箭头,如下所示: 1 2 3 4 5 或者像这样(其中/假设是一个箭头:)): \/ -----------------
我正在为 Java 编写自定义规则。有两个 Tree.KIND 实例(STRING_LITERAL 和 ASSIGNMENT)需要捕获。有一个特定的行,字符串文字和赋值的逻辑都会引发问题。但 Sona
Rosettacode.org 在 Ruby 中有这个出色的单行 FizzBuzz 解决方案。 1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n
很多时候我使用了这个命令,它在当前目录打开了一个临时的 HTTP 服务器: python3 -m http.server 现在我需要接收文件,有没有打开ftp服务器的一行命令? 我只是在寻找一个命令行
相关主题 std::unique_ptr, deleters and the Win32 API 要将 Win32 句柄用作 RAII,我可以使用以下行 std::unique_ptr::type,
我认为必须有一个单行 Guava 解决方案来将一个不可变列表转换为另一个不可变列表,但我找不到它。假设我们有以下对象: ImmutableList input = ImmutableList.of("
我有以下 Highcharts ( http://www.highcharts.com ) 散点图。请注意,轴从 -10 开始,到 10 停止,中间为 0。我希望每条 0 线的宽度或颜色都与其他线不同
我有一个项目需要将一个视频文件与另一个音频文件合并。预期的输出是一个视频文件,其中包含来自实际视频的音频和合并后的音频文件。输出视频文件的长度将与实际视频文件的大小相同。 是否有单行 FFMPEG 命
我在 python3 类中有 2 个列表: self.keys = ["a","b","c","d"] self.values = [1,2,3,4] len(self.keys) == len(se
我有一个不同长度的数组列表,我想将它们组合成一个最大维度的矩阵,并在末尾填充零。例如(伪代码): combine( [1,2,3], [4,5]) [[1,2,3],[4,5,0]] 这是我目前的解决
例如,给定 i=5 和 n=8,我想生成 [0;0;0;0;1;0; 0;0]。具体来说,我想生成向量 v 以便: v = zeros(n,1); v(i) = 1; 有没有一种(合理的)方法可以在一
我是一名优秀的程序员,十分优秀!