Comments 58
если на одном сервере сделать 20 http портов слушающих ws и на каждом по 40к коннектов?
это вместо 20 виртуалок.
Ну всего лимит 65к коннектов с одного клиента в один порт, минус занятые файловые дескрипторы, можно и с одного клиента 1кк коннектов открыть, если в разные порты и лимиты настроить, но про разные порты я не подумал, а с лимитами в lxc было что-то мутно. Кстати как балансировать 20 разных портов?
как балансировать по портам — чисто теоретически — массив — свободных, при подключении/открытии страницы брать из него свободный и подставлять… и убирать из массива…
для начала как бы проверить вообще такую возможность — несколько http портов вместо машин.
и вроде для ws подключений нет ограничений для количества портов. они вроде как отдельно от портов http? ( имеется в виду все 65к)
Да и как раз на проде сложно представить реальную задачу, где Erlang составил бы сильную конкуренцию Go. Разве что какие очень развесистые деревья или подобные структуры.
Была ли проверка с mnesia in memory в качестве базы данных на отдельной ноде? Теоретически это позволило бы мониторить упавшую ноду и обновлять цифры.
Тесты проводились на примере простейших чатов на Go и Phoenix
мне, например, непонятно что за такие простейшие чаты и откуда,
хороший тон: публиковать тестируемый код, иначе остается словам верить.
Для Gorilla — github.com/gorilla/websocket/tree/master/examples/chat
Для Phoenix — github.com/chrismccord/phoenix_chat_example
В тот момент не планировали что-либо публиковать, и многое из тестируемого кода просто не сохранилось
— Скольку удавалось получить new-connections-per-second (создание нового соединения — процесс очень дорогой)
— Какая messages-per-second
— Какое latency при передаче сообщения клиент-клиент
— Какое время регистрации нового клиента
Порядка 220 новых соединений в секунду, 200к ботов.
Время регистрации нового клиента не превышает 50ms.
В пике около 6000 сообщений в секунду летает между сервером и клиентами.
У нас бизнес логика не предполагает общения клиент-клиент, NDA не позволит дать конкретики, абстрактно схема следующая:
1. Событие на сервере -> Уникальные сообщения для большой группы пользователей
2. Реакция пользователя -> Сообщение серверу о том что пользователь подтвердил получение сообщения 1
Вот интересно, вы, как Тимлид проекта, когда выбирали Элексир vs Go — рассматривали ли вопрос кадров? Кажестся, что у нас куда проще найти Go-разработчика, чем Erlang/Elixir.
Кстати, случайно не подскажете где ссылка на сайт автора в продакшене?
Далее я рассмотрел Node.JS WS. Этот фреймворк показал неплохие результаты – около 5 тысяч коннектов на тестовом стенде без дополнительных настроек
Возможно 5000. Ссылки на сайт автора у меня нет.
По поводу использования конерктно nodе.js и конерктно для веб-сокетов очень большие вопросы есть. Если бы был реальный пример то можно было бы пробовать реализовать в нагруженном (хотя бы) проекте.
Сам я в ноде практически 0, так что хз.
wouter
April 13, 2015 at 20:37 /
What did you use to generate 620k connections?
And did you send a message over every connection every x seconds or was is just a silent connection?
Daniel Kleveros
April 14, 2015 at 08:11 /
I created my own client with the same websocket lib websockets/ws which I then deployed on a cluster of M1.Large instances.
It was silent connections but to keep the connections alive, if you are behind a elastic load balancer, you need to check the idletimeout setting on the loadbalancer and send a ping before that time expires. If not the load balancer will start to drop your connections.
Все больше склоняюсь к тому, что автор статьи лукавит. Вот почему: конфиг который он скинул – кривой косой, отсутствуют примеры кода, тулза под названием artillery выдает не очень полезную инфу.
Скорее всего человек просто получил задачу написать статью. Кое-как сделал, накидал и вот уже на хабре. Все вопросы можно игнорировать сославшись на NDA. Спрашивается, зачем писать статью если нет возможности рассказать полностью…
Давайте загуглим эту конторку под названием mediasoft.
Вот она http://php73.ru/.
А это favicon этого сайта:

Хотел найти список сотрудников там, но не нашел. То ли конфиденциальность такая, то ли лень, то ли текучка кадров лютая… Непонятно. Зато есть список выполненных работ, где числится carprice. Ну вот, хоть заценю этот сайт и гляну как вебсокеты работают там. Честно говоря спустя 5 минут так и не нашел где там вебсокеты. Попытался купить авто, но мне просто открывалась еще одна такая же вкладка браузера. Простой php сайт на битриксе?
Всё это очень мутно выглядит, что даже не хочется дальше разбираться. Ну не смогли на js 100к коннектов сделать да и пофиг.


config:
target: "http://localhost:3000"
socketio:
transports: ["websocket"]
phases:
- duration: 1
arrivalRate: 2
scenarios:
- engine: "socketio"
flow:
- think: 1
Started phase 0, duration: 1s @ 22:50:07(+0600) 2018-03-15
Report @ 22:50:10(+0600) 2018-03-15
Scenarios launched: 2
Scenarios completed: 2
Requests completed: 0
RPS sent: NaN
Request latency:
min: NaN
max: NaN
median: NaN
p95: NaN
p99: NaN
All virtual users finished
Summary report @ 22:50:10(+0600) 2018-03-15
Scenarios launched: 2
Scenarios completed: 2
Requests completed: 0
RPS sent: NaN
Request latency:
min: NaN
max: NaN
median: NaN
p95: NaN
p99: NaN
Scenario counts:
0: 2 (100%)
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 3000;
io.on('connection', function (socket) {
console.log("connected");
socket.on('hello', function (msg) {
console.log("hello");
io.emit('hello', msg);
});
});
http.listen(port, function () {
console.log('listening on *:' + port);
});
не холивара ради, простое любопытство: почему не СИ?
я набросал работающий фреймворк за день. но у меня уже было понимание, как устроен протокол. разобрался когда пытался, несколько лет назад, делать сервер на CLI PHP.
А вот работающие «фреймворки» давно написаны и вряд ли можно написать что-то более производительное, чем связка libwebsocket и libevent.
а вообще, я уверен, что-то уже есть. вот люди советуют вам посмотреть libwebsocket и libevent, посмотрите, хотябы и обзорно. хотябы и после того, как «горящий» проект сдадите в прод. я думаю такие вещи имеют высокую повторяемость в потребности, и время на изучение, проработку вопроса не будет потрачено без пользы. оно себя с лихвой окупит в будущем.
Приветствую всех!
Ws действительно интересная тема. Недавно была задача для crm-bpm системы сделать event-сервер. Я остановился на node.js. У меня, служба работающая под pm2, является клиентом ws для asterisk. Ловит и обрабатывает все события АТС и раздает авторизованным пользователям системы, подключенным по wss, уведомления о входящих звонках, проверяя соответствия номера клиента с наличием в базе данных. Также от пользователей приходят комманды на уведомления других пользователей при постановке задачи, состояние он-лайн, офф-лайг, а также работа по API с сайтами при поступлении POST запросов. То есть, одновременно это клиент и сервер.
Пользователей он-лайн около 200, события от АТС идут постоянно (один только звонок порождает около 6000 тыс. строк), их около 400 в день. С сайтов приходят запросы, но немного, один-два в час.
Так к чему я это все рассказывал. Честно говоря не могу понять как протестировать нагрузку, чтобы можно было смело говорить о каких-то конкретных цифрах.
Я конечно понимаю, что видимо знаний мало, но тут и запросы к базе и активность клиентов системы очень варьируется, и данные по API разный объем имеют. Плюс-минус километр если, то на 200 пользователей при 400 звонках в день и 300 задачах в системе + 40 отправленных сообщений по API в сутки, пиковая нагрузка по RAM была 81mb. По процессору не более 10%. Можно смело об этом говорить, что эти показатели не превышались никогда, так как PM2 в этом случае перезапускал бы службу (ну должен это делать во всяком случае) и фиксировал это событие.
Интересно было бы узнать о каких-то системах расчета нагрузки, потому как мои средние наблюдения и "простые чаты" это как-то из разряда средней температуры по больнице…
За статью спасибо! Я, к сожалению до Go не дошел в этом вопросе, а PHP отмел по причине неудобной, ИМХО реализации по работе с сокета и.
Сам большой поклонник PHP, но сдался в связи в удобством реализации на Node.
Могу сказать только что socket.io многократно больше потребляет траффика… или я «котов не умею готовить» :)
т. Плюс-минус километр если, то на 200 пользователей при 400 звонках в день и 300 задачах в системе + 40 отправленных сообщений по API в сутки, пиковая нагрузка по RAM была 81mbНа ноде такая загрузка была? Конечно одновременных 200 соединений это почти ничего но все равно я предполагал большую цифру.
www.npmjs.com/package/ws
Там банальный небольшой скрипт процедурный. Никакого специализированного фреймворка. Все время/трудозатраты в основном на тесты и отладку ушли. Те же event`ы различных диалпланов Астериска парсить. А лимиты такие сугубо из показателей мониторинга. Как только PM2 начнет ребутить, то будет повод посмотреть логи, подумать о том, что надо ресурсы увеличить, или увидеть очередной объект, который надо за`delete`ить.
Есть другая библиотека — uws (на С++). Производительность и расход ресурсов различается в несколько раз. Особенно момент массового подключения клиентов и если много данных передавать.
График (производительности) на Github соответствует заявленным цифрам, есть другие обзоры.
Интерфейс библиотеки совместим с пакетом ws, socket.io/engine.io/… поддерживают замену пакета. Единственный минус — необходимо компиляция.
www.npmjs.com/package/uws
github.com/uNetworking/uWebSockets
вот и хотел код глянуть
с фениксом не работал, тут нечего сказать
интерес исключительно по NodeJS
по готовым примерам… вот готовый модуль, лаботающий на сокетах, использующий нативный модуль
www.npmjs.com/package/ipc-socket
максимальный лимит который был достигнут на моей машине, 35к/сек
этот модуль у нас так же используется в проде, по нему гоняем логи с нескольких проектов в единое хранилище
замерял только на своей локальной машине
замер производился на конфигурации
i7
16G RAM
у имеющихся двух серверов, только оперативы в 2 раза больше, остальные параметры примерно те же
а там TCP сокеты никто никогда не отменял
Также поддержка веб-сокетов из соображений скажем безопасности моет быть отключна администраторами корпоративной сети для доступа к внешним сверерам/сайтам.
не слышал ни одного такого случая
если что-то закрывается с целью безопасности, то уже сразу целым доменом/IP
Или если перейти на серверы то это у вас со всего мира 150 000 серверов к Вами присоединились и держат коннекты. А если у Вас пусть даже миллион сообщений в секунду но от сотни серверов то это как раз сто содеинений а не сто миллионов соединений.
Есть сторонний хэндлер для cowboy 2: github.com/voicelayer/phoenix_cowboy2.
Было бы интересно взглянуть на графики из статьи ещё раз, но уже с cowboy 2
Как чужой опыт, статья конечно имеет право быть, но ИМХО выглядит она как хвалебная песня в честь Linux, Go и Erlang.
Можно было просто сказать, что наша команда знает Linux, Go и Erlang и поэтому в условиях дефицита времени для достижения цели выбрали в качестве инструмента, то что мы лучше всего знаем. (И это единственно правильное решение).
Но недостатки других решений или преимущества (Linux, Go и Erlang) совсем не очевидны.
Чем плох PHP и в частности PHP Workerman не понятно!
«Poll vs. Epoll»… А где kqueue/kevent?
Или kqueue настолько не эфективен что не заслужил упоминания? Да,… не кросплатформенно… да, с этим умеют работать только BSD системы и некоторые комерческие системы используют подобный подход.
Но согласитесь, что это проблема Linux, а не PHP Workerman!
NGINX + PHP-FPM умеют использовать эфективный kqueue и вместе они прекрасно масштабируются «по самое не могу»!
«PHP Workerman — Код находится на уровне PHP 5.3 и не соответствует никаким стандартам.» — простите, а каким конкретно стандартам он должен соответствовать?!
У меня код работал на PHP 7.1, но если автор тестировал на сервере с PHP 5.3, то это даже не проблема настроек PHP… и уж тем более не проблема PHP Workerman. И из этого не следует, что он не позволяет реализовывать высоконагруженные проекты…
Скажем прямо, просто Вы выбрали другой путь… свой путь.
У меня код работал на PHP 7.1
Не сочтите за наезд. Я просто реально хочу получить реальные данные о реальных серверах (как у автора этой статьи). Какая нагрузка была на приложение? Какие были затраты по памяти/процессорам? Как мониторилась доступнасть веркеров? Сколько было запущено веркеров? Каки были организованы сессии в смысле как отслеживалось чтобы лиибо было соединение с одинм и тем же веркером или же данные расшарвались между веркерами? Расскажите. Это интересно.
Можно было просто сказать, что наша команда знает Linux, Go и Erlang
Это было-бы великолепно, но увы это был первый опыт работы с Elixir
А где kqueue/kevent?
Нельзя объять необъятное, BSD системы не рассматривали, хотя возможно стоило
а каким конкретно стандартам он должен соответствовать
Ну для начала PSR
Разработка высоконагруженного WebSocket-сервиса