через _id(уникальный) пользователя записал в базу и он по сути вечный,
find().select(/* объект с полями */)
. По умолчанию mongoose возвращает коллекцию своих обёрток над JS-объектами, которые довольно тяжелые. Получить POJO можно с помощью find().lean()
. Чтобы не ждать, пока вам вернётся вся коллекция из 1500 записей, можно воспользоваться курсорами со стримами и работать с данными пачками. var io = require('socket.io')(server);
app.set('io', io);
var io = req.app.get('io');
server {
listen 80;
server_name example.com;
location /all.css {
root /srv/vek-node/static;
}
location /all.css.map {
root /srv/vek-node/static;
}
location /img {
root /srv/vek-node/static;
}
location /vendors {
root /srv/vek-node/static;
}
location /media {
alias /var/www/vek_staging/media;
}
location /catalog/metal {
rewrite ^ http://metal.example.com$request_uri? permanent;
}
location /admin {
uwsgi_read_timeout 600;
client_max_body_size 30m;
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/run/uwsgi/app/vek_staging/socket;
}
location /static {
alias /var/www/vek_staging/static;
}
location / {
include /etc/nginx/proxy_params;
proxy_read_timeout 120;
proxy_pass http://127.0.0.1:3331;
}
}
var http = require('http');
var ipTables = {};
var server = http.createServer((req, res) => {
//Ваш обработчик запроса или express/connect вместо него
});
server.on('connection', socket => {
var ip = socket.address().address;
var time = Date.now();
if(ip in ipTables) {
if(time - ipTables[ip].time > 3000) {
ipTables[ip] = {
count : 1,
time
};
return;
}
ipTables[ip].count++;
ipTables[ip].time = time;
if(ipTables[ip].count > 100) {
socket.end('HTTP/1.1 429 Too Many Requests\n\n');
socket.destroy(); //Обрываем соеденение, так как ip ломится слишком часто
}
return;
}
ipTables[ip] = {
count : 1,
time
};
});
server.listen(80);
var express = require('express');
var app = express();
var io = require('socket.io')(http);
http = require('http').Server(app);
http.listen(yourPort, yourUrl, function () {
console.log('App listening at http://%s:%s', yourUrl, yourPort);
io.on('connection', function(socket){...}
socket = io.connect(yourUrl:yourPort, {secure: true, forceNew: true});
socket.on('onCommentAdd', function(msg) {
yourFuncToAddCommentInHTMLDOM(msg)
});
Socket.emit('onCommentAdd', {author: "Vova", date: "1454576067", "text": "Azazazaza lalka" });
Если коротко, то ошибка закралась вот тут:
В асинхронном сервере в единый момент времени обрабатывается столько запросов, сколько есть воркеров
Представьте себе, что у вас на сервер приходит запрос, связанный с выборкой данных из БД.
Он отрабатывает, предположим, за 150 мс, из которых 130 это работа с базой данных.
В случае с PHP у вас воркер будет заблокирован эти 150 мс для обработки других запросов.
В случае с асинхронным сервером, он, пока запрос 1 ждет данные от БД в течение 130 мс, сможет принять и начать обрабатывать другие запросы. Предположим, что у нас один PHP-воркер. В этом случае таких запросов, как из примера, он сможет обработать семь штук за секунду.
Асинхронному же, допустим, прилетят 20 запросов. Он обработает каждый до взаимодействия с БД, допустим за 10 мс, полетят 20 запросов к БД, пройдут, допустим, за 500 мс, и сервер сформирует ответ. И это все практически параллельно. Итого меньше чем за секунду мы таким образом обработаем 20 запросов.
Можно, конечно, увеличить пул FastCGI, но оверхед при обработке запроса каждым воркером будет несоизмеримо выше, чем при обработке асинхронным сервером.