Комментарии 41
НЛО прилетело и опубликовало эту надпись здесь
Ну, я могу также сказать — взяли с++, компилятор и написали. Что тут особенного? :-)
Дело в том, что когда дело дошло до production-ready сервера быстрых коммуникаций, оказалось, что на рынке нет ничего адекватного, кроме глючного модуля для nginx, внутри которого был необновляемый копипаст ядра nginx :-)
Писать большой плагин для nginx, исходники которого недокументированы — пустая трата времени и сил. Аналогом модели nginx является, с небольшой натяжкой — NodeJS. Имхо решение получилось сбалансированное как по выбору технологии, так и по отдаче.
Дело в том, что когда дело дошло до production-ready сервера быстрых коммуникаций, оказалось, что на рынке нет ничего адекватного, кроме глючного модуля для nginx, внутри которого был необновляемый копипаст ядра nginx :-)
Писать большой плагин для nginx, исходники которого недокументированы — пустая трата времени и сил. Аналогом модели nginx является, с небольшой натяжкой — NodeJS. Имхо решение получилось сбалансированное как по выбору технологии, так и по отдаче.
+3
А как теперь в этой схеме работает Nginx с нодой? Или там простое транслирование запросов? Или терминирует на себя вебсокеты и http, а к нодам ходит по другому протоколу?
0
Ничего удивительного: выбрали плохую технологию (Node.js) и потом успешно боролись с её непригодностью для программирования: невозможность использования памяти для обработки данных.
В итоге вы не непригодной нодой пользуетесь, а редисом.
В итоге вы не непригодной нодой пользуетесь, а редисом.
0
Чем плох Node.js?
+4
во-первых, как верно подметил автор текста, Node.js не годиться для хранения и обработки данных в памяти из-за мультипроцессной архитектуры.
Писали бы на Erlang, Java или Go, можно было бы обойтись _одним_ демоном, а это проще отлаживать, развертывать и контролировать.
Во-вторых, Nodejs — это беспощадные коллбеки или промисы, которые не много чем лучше. Отследить, куда утекла память невозможно, да и не нужно, потому что в отличие от эрланга, который может не поперхнувшись использовать 200 гигабайт, а потом обратно сдуться до 500 мегабайт, у Node есть ограничения в памяти по лимиту.
А память — это один из самых быстрых способов хранить и обрабатывать информацию. Просто люди из мира PHP это боятся и не привыкли к этому, ведь в PHP надо всегда пользоваться внешней работающей БД из-за непригодности самого языка.
Плюс, конечно, никакой интроспекции работающей системы в рантайме, как в Эрланге нет и не планируется.
Писали бы на Erlang, Java или Go, можно было бы обойтись _одним_ демоном, а это проще отлаживать, развертывать и контролировать.
Во-вторых, Nodejs — это беспощадные коллбеки или промисы, которые не много чем лучше. Отследить, куда утекла память невозможно, да и не нужно, потому что в отличие от эрланга, который может не поперхнувшись использовать 200 гигабайт, а потом обратно сдуться до 500 мегабайт, у Node есть ограничения в памяти по лимиту.
А память — это один из самых быстрых способов хранить и обрабатывать информацию. Просто люди из мира PHP это боятся и не привыкли к этому, ведь в PHP надо всегда пользоваться внешней работающей БД из-за непригодности самого языка.
Плюс, конечно, никакой интроспекции работающей системы в рантайме, как в Эрланге нет и не планируется.
-4
С использованием памяти для обработки данных в ноде все хорошо, проблемы у автора начались при использовании памяти для хранения данных. Но эта же проблема присутствует и в других языках — так для того СУБД и изобрели.
+2
нет, у него проблемы именно с оперативным обменом данными.
0
Что вы понимаете под «оперативным обменом данными»? Кто и с кем обменивается?
0
источник данных с клиентами.
Плюс я так и не понял, умеют ли они poll
Плюс я так и не понял, умеют ли они poll
0
Не понимаю. В статье про него ничего не говорилось. Нельзя ли подробнее?
0
Если пуш сервер поддерживает только веб-сокеты, то дела очень плохи, потому что вебсокеты до сих пор не везде проходят. В некоторых местах их режут, где-то даже кешируют плохой ответ. Одни лишь вебсокеты не очень подходят для пуша.
0
НЛО прилетело и опубликовало эту надпись здесь
Это ничего что WebSocket допускает только 1 коннект на сайт? Т.е. открыв вторую вкладку, например в Хроме, получим пресловутое «ожидание свободного сокета»
0
Это сильно зависит от браузера. Ну и обходится одной строкой в DNS-настройках поддомена и одно строкой на клиенте — заодно получаем DNS-балансировку
0
Это не так. Современные браузеры, поддерживающие технологию WebSocket, не ограничивают браузер одним соединением на сайт.
0
конечно наплевать. Равно как и то, что одними вебсокетами жив не будешь: их режут DPI системы у глупых провайдеров.
0
Хотелось бы больше деталей увидеть. Например,
— почему ws, а не socket.io?
— почему всё-таки ушли от pm2?
— c чем именно связано равное к-во использования клиентами long polling & websocket?
— почему ws, а не socket.io?
— почему всё-таки ушли от pm2?
— c чем именно связано равное к-во использования клиентами long polling & websocket?
+1
Тоже интересует первый вопрос. Предполагаю, что вместо использования клиентского готового socket.io написан клиентский велосипед.
0
почему ws, а не socket.io?
Socket.io сам внутри себя использует ws. По статистике npm, ws самый популярный модуль для вебсокетов. Плюс ряд тестов показывают, что он еще и самый быстрый.
почему всё-таки ушли от pm2?
Отказались, как от возможной причины внезапных зависаний системы. PM2 запускало приложение в режиме кластера и выполняло роль балансировщика.
c чем именно связано равное к-во использования клиентами long polling & websocket?
Видимо не совсем понятный график получился :). На нем изображено 100 тысяч вебсокетов и 5 тысяч lp-запросов.
+1
у socket.io навернуто сверх нативного websocket очень много. мы его не используем по этой причине — есть сервисы на C#, которым тоже нужно общаться с сервером сообщений, и придется эмулировать «протокол» socket.io, и если они что-то поменяют — все просто может перестать работать. erinarios ws — это нативный websocket.
а так конечно socket.io очень удобный и в нем много чего из коробки есть.
а так конечно socket.io очень удобный и в нем много чего из коробки есть.
0
Можно было SockJS использовать тогда.
Но все уже написано — socketio4net.codeplex.com
Но все уже написано — socketio4net.codeplex.com
0
Released: Jun 26, 2012
по-моему наши как раз его и использовали (ребята тогда нашли только одну либу для этого), но автор на него давно забил. либа работает только с версией socket.io 0.9 и младше, а в 1.x они уже сильно поменяли протокол. поэтому и решили нативный брать, без наворотов.
я когда писал comet-сервер перебрал много разных компонентов — у каких-то на тот момент wss был криво реализован, кто-то не мог проксировать запросы по части урла на одном ip на upgrade
поэтому был выбран ws
по-моему наши как раз его и использовали (ребята тогда нашли только одну либу для этого), но автор на него давно забил. либа работает только с версией socket.io 0.9 и младше, а в 1.x они уже сильно поменяли протокол. поэтому и решили нативный брать, без наворотов.
я когда писал comet-сервер перебрал много разных компонентов — у каких-то на тот момент wss был криво реализован, кто-то не мог проксировать запросы по части урла на одном ip на upgrade
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
function proxyWebsocketResponse(req, res, head) {
try {
var pathname = url.parse(req.url).pathname;
if ( (config.comet.websocket.proxy) && (pathname === config.comet.websocket.path) ) {
var options = {
target: 'ws://' + config.comet.websocket.host + ':' + config.comet.websocket.port + '/',
ws: true
};
proxy.ws(req, res, head, options);
proxy.on('error', function(e) {
console.error('WebSocket error: ' + e.message);
res.end();
});
} else {
res.statusCode = 501;
res.end('Not Implemented');
}
} catch (e) {
console.error('Error: ' + e.message);
}
}
httpServer.addListener('upgrade', proxyWebsocketResponse);
поэтому был выбран ws
0
А вариант отдельного протокола для связи с сервисами на C# не рассматривался?..
0
НЛО прилетело и опубликовало эту надпись здесь
незачем. ui, comet и различные сишные демоны — это отдельные распределенные компоненты продукта.
0
Не почему же «незачем»? Чтобы свой велосипед вместо socket.io не писать…
0
removed
0
Дааа я тоже ждал более технического описания, примеров, аналитики по скорости работы по сравнению с предидущим решением… :(
+1
Почему Redis, а не Rabbit?
Rabbit как-то более предназначен для каналов (очередей) сообщений, да и с роутингом значительно интереснее.
Rabbit как-то более предназначен для каналов (очередей) сообщений, да и с роутингом значительно интереснее.
0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
О новом push-сервере «1С-Битрикс»