node.js集群,redis,单线程和非阻塞I / O如何工作?

一旦

我将尝试总结最近学到的有关节点配置的所有内容。如果正确,请确认。如果我搞砸了,请纠正我和其他人。

Node.js是一台服务器。作为服务器,它可以接收来自客户端的请求。可以说一段时间内有200个请求。

由于node.js是一个单线程,因此可以通过一个单元/一个内核来处理所有这些请求。

但是,节点也是事件非阻塞的I / O,这意味着某人可以在node.js API中请求某些方法,该方法需要1分钟才能完成,而其他人可以请求另一种方法,该方法也需要1分钟才能完成。两者可以同时处理,而无需等待彼此完成。

现在听起来很棒,但是如果我们协助节点服务器并让它作为代理将200个请求的那些任务分发给集群/工作者,它甚至会更好。因此,节点服务器成为客户端与工作人员之间的代理。像项目经理一样:)

这样做的好处是,现在不是4个核心处理一个请求,而是一个核心处理200个请求,并且每个核心都是事件非阻塞I / O(取决于课程的服务器规范)。

多数民众赞成在超级快。是不是

这是问题/我想了解的内容:

如何使这些集群/工人共享工作?

我的意思是,如果将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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章