|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
В нетбинзе сделал по гайду простой сервер, принимающий сокет-подключения. Приложение по дефолту деплоится на GF 4.0 Все работает. Пробуй проверить сколько коннектов может создать. На клиенте в js создаю массив и туда в цикле пихаю new WebSocket. То есть открываешь страницу и она в js генерит коннекты к приложению. 1. коннекты создаются довольно медленно 2. затыкается стабильно на 191-ом коннекте и дальше будто ничего не происходит. На сервере в javax.websocket.OnOpen после 191 подключения ничего не приходит, на клиенте в try catch ничего не падает. Вопросы 1. куда копать, почему 190 и все? 2. как правильно проверить максимальное число подключений? 3. если число подключений ограничено, какая стратегия работы с websocket? 4. как защититься от генерации большого числа коннектов на открытом для общего доступа сайте? Изначально вопрос возник отсюда. Можно все делать на том же ajax и опрашивать сервер например 1 раз в сек, данные для ответа брать из кэша приложения (чтобы не лазить по каждому запросу в БД), но не уверен, что это нормальный подход и не знаю какую нагрузку можно держать при таком варианте. Поэтому интересно посмотреть в сторону вебсокетов, чтобы не опрашивать сервер кучей сессий каждую секунду, а отправлять клиентам инфу по мере ее готовности на сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 22:43 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS 1. куда копать, почему 190 и все? JDS 4. как защититься от генерации большого числа коннектов на открытом для общего доступа сайте? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 00:59 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Андрей Панфилов так никто в интернетах вебсокеты без необходимости (если не нужен "риалтайм") не использует: JDS 1. коннекты создаются довольно медленно JDS 2. затыкается стабильно на 191-ом коннекте и дальше будто ничего не происходит. у ws ограничение в ~65к подключений на 1 ip порт. JDS 4. как защититься от генерации большого числа коннектов на открытом для общего доступа сайте? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 12:18 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Я не понимаю тестовых условий. GF - это GlassFish? 191 физический сокет это мало. Если клиент - это понятно зачем. Нефик. Если сервер - что за операционка? Если GlassFish - что за настройки? Java в явном виде не ограничивает количество сетевых сокетов. Вобще очень полезно для понимания проблемы прикладывать сводку о конфигурации. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 12:50 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
вадя это наиболее простой метод и самый экономичный с точки зрения трафика, нагрузки на сервер. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 13:20 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Андрей Панфилов вадя это наиболее простой метод и самый экономичный с точки зрения трафика, нагрузки на сервер. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 16:07 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Да. Ограничение похоже, что в браузерах. В фоксе не дает больше 190, в хроме - 260. Ну допустим. Вопрос гор. и вертик. масштабируемости все равно актуален. 65К подключений это немало, но и немного. Информация обрывочная, целостной картины не собрать. Кто-то пишет про мультиплексоры, которые распределяют коннекты по разным портам что ли. Кто-то про балансировщики. Кто-то прикручивает до кучи брокеры. Но в итоге якобы догоняют количество коннектов до 1млн на одной машине. А так да пока винда и гласфиш. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 17:09 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS 65К подключений это немало, но и немного. AFAIK ограничение протокола TCP/IP JDS Но в итоге якобы догоняют количество коннектов до 1млн на одной машине. AFAIK тогда, теоретически, нужно кол-во адресов TCP/IP увеличивать Ну и если сервер выдержит, то еще вопрос, выдержит ли роутер/свитчь ))) Но вообще, громоздить все на одну машину - странное желание. Для какого нибудь балансира/мультиплексора ресурсов особо не требуется. Проще выкинуть на отдельный аппаратный сервер уровня Arduino ))) IMHO ))) дешево, надежно и сердито. Ну и понятное дело, что только NIO. При классических сокетах и "обычном" (TM) Linux, сервера уже при > 10 тыс. потоков сдыхать начинают. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 17:33 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS Вопрос гор. и вертик. масштабируемости все равно актуален. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 17:41 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS Да. Ограничение похоже, что в браузерах. В фоксе не дает больше 190, в хроме - 260. Ну допустим. Вопрос гор. и вертик. масштабируемости все равно актуален. 65К подключений это немало, но и немного. Информация обрывочная, целостной картины не собрать. Кто-то пишет про мультиплексоры, которые распределяют коннекты по разным портам что ли. Кто-то про балансировщики. Кто-то прикручивает до кучи брокеры. Но в итоге якобы догоняют количество коннектов до 1млн на одной машине. А так да пока винда и гласфиш. Ты понимаешь что одновременное количество сокетов - это суть одновременное количество работающих Threads? Ты хотябы 100 вычислительных потоков попробуй запусти. У тебя от этого поплывёт CPU. И никакой более ползеной работы этот CPU не сделает. Он будет в спинах и локах висеть на самом деле. А если твоя задача такова что на самом деле полезной работы не делается а сокеты просто висят (для красоты) то наверное тогда надо архитектуру приложения пересмотреть. Зачем они висят? Просто жрут память? Для справки любой сокет требует буфера памяти. Такова есть природа TCP/IP. Ему буфер нужен. Буфер! Чтобы шум из эфира собирать в цельные стримы. Здесь каждая ОС по своему выделяет. Но ты просто попробуй 64000 сокетов создать на любой машине. И потом расскажи как эта машина себя чувствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 17:41 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
вадя у ws ограничение в ~65к подключений на 1 ip порт. ведь можно тот же томкат использовать на несколько портов( кроме 80 или 8080) и на каждый порт ещЁ по 65к ws портов... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 17:45 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
mayton Ты понимаешь что одновременное количество сокетов - это суть одновременное количество работающих Threads? --- NIO ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 18:29 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev mayton Ты понимаешь что одновременное количество сокетов - это суть одновременное количество работающих Threads? --- NIO Этот ответ столь же полезен и прекрасен для автора как панацея для средневекового доктора. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 19:15 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
В NIO нет связи соккет=поток. 6-20 потоков (если считать и служебные) вполне могут разгребать тысячи сокетов одновременно (мой код точно 600-800 и более одновременно в продакшене держал, для JVM было выделяно вроде 4 ядра) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 19:42 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
И, вроде, в I-net'е гуглится, что лимита особого и нет. Просто все упирается в память. "There isn’t a useful hard limit, as you run into various problems long before you hit numerical restrictions, and it depends on the hardware — memory, number of cores, the network interfaces, etc." ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 19:45 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Флаг в руки. Веди автора до конца. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 19:51 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev В NIO нет связи соккет=поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 19:52 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
mayton А если твоя задача такова что на самом деле полезной работы не делается а сокеты просто висят (для красоты) то наверное тогда надо архитектуру приложения пересмотреть. mayton Зачем они висят? Просто жрут память? Для справки любой сокет требует буфера памяти. Такова есть природа TCP/IP. Ему буфер нужен. Буфер! Чтобы шум из эфира собирать в цельные стримы. Здесь каждая ОС по своему выделяет. Но ты просто попробуй 64000 сокетов создать на любой машине. И потом расскажи как эта машина себя чувствует. на SO писали что у них висят сессии по 1.5 года. и как бы они не парятся (хотя, скорее всего, это просто отвалившиеся клиенты, и SO не проверяет их пин-понгом). если б это было слишком накладно , то они, наверно, позакрывали б такие сессии . mayton то наверное тогда надо архитектуру приложения пересмотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2020, 21:10 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS Вопрос гор. и вертик. масштабируемости все равно актуален. 65К подключений это немало, но и немного. Для HTTP и многих других протоколов пара dst-ip:dst-port фиксирована. Дальше включаем банальную логику и получаем тривиальный вывод: даже когда провайдер спрятал за NAT на одном (единственном) IP-адресе ~16К клиентов, "немного" это "более чем достаточно". Почему 16К? Потому, что есть рекомендации по распределению портов по диапазонам. В любом случае вам, как владельцу сервиса, должно быть покласть на проблемы клиентов за конкретным провайдером. В данном конкретном случае - совершенно объективно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2020, 09:05 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
вадя на SO писали что у них висят сессии по 1.5 года. и как бы они не парятся (хотя, скорее всего, это просто отвалившиеся клиенты, и SO не проверяет их пин-понгом). если б это было слишком накладно , то они, наверно, позакрывали б такие сессии . Надо понять какой смысл они туда вкладывали. Java-объект сессий? Вполне возможно. Он еще и персистится. Сокет? Не знаю. Мы живем в эпоху сильной виртуализации всего стека. Выше писали что сокет это просто пара значений хосты и порты. И чтобы эта пара жила 1.5 года - надо чтобы клиент висел 1.5 года (и провадер не менял ему арендованый IP) либо здесь имеет место хитрая виртуализация (proxy, nat, socks) которая на надёжном железе просто виртуализирует внешние соединения замещая их своими фейковыми адресами. И если железо 1.5 года не ремонтировалось и не патчилось и не перегружалось (во что мне сложно поверить т.к. даже амазон падает и часто) то вполне возможно что мы получим такую статистику. Хорошо это или плохо - я не знаю. Но мне кажется что к надёжности это имет мало отношения. Ведь надёжность должна быть до "последней мили" а не на фрагменте маршрута. Помните анекдот про то как пули вылетели из ствола? Вот 1.5 года из этой же серии. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2020, 17:24 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
mayton Надо понять какой смысл они туда вкладывали. Java-объект сессий? Вполне возможно....... в итоге я оставил это всё на совести SO. и просто информирую о данном факте. из своего опыта - ws очень надёжная и очень удобная вещь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2020, 17:50 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev В NIO нет связи соккет=поток. 6-20 потоков (если считать и служебные) вполне могут разгребать тысячи сокетов одновременно (мой код точно 600-800 и более одновременно в продакшене держал, для JVM было выделяно вроде 4 ядра) Не понимаю как это выглядит внутри программы? Предполагается, что приложение может обрабатывать все данные в одном потоке или в нескольких, это не суть, главное, что оно складывает потом все данные в общий буфер. И потом это приложение должно раскидывать всем подключенным клиентам ту часть информации, которая их касается. То есть каждый коннект (в основном) не генерит на сервере какой-то отдельный вычислительный поток с отдельным запросом. И забирать информацию из буфера можно тем же http через каждую секунду например, но это кажется накладным, а сокеты видятся хорошим вариантом с точки зрения идеологии, но затык в масштабируемости, который не пойму как обходится и обходится ли. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 16:49 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS Предполагается, что приложение может обрабатывать все данные в одном потоке или в нескольких, это не суть, главное, что оно складывает потом все данные в общий буфер. И потом это приложение должно раскидывать всем подключенным клиентам ту часть информации, которая их касается. То есть каждый коннект (в основном) не генерит на сервере какой-то отдельный вычислительный поток с отдельным запросом. И забирать информацию из буфера можно тем же http через каждую секунду например, но это кажется накладным, а сокеты видятся хорошим вариантом с точки зрения идеологии, но затык в масштабируемости, который не пойму как обходится и обходится ли. серверная часть состоит из "слушателя порта ws" - т.е. одна точка входа. Код: java 1. 2. 3.
в этом методе ты можешь распарсить String data выделить команду и передать управление методу который соответствует этой команде и соответственно передать сами данные , а так же передать Session userSession , как правило клиенту надо ответить (что не обязательно). а как метод/команда будет работать - это уже твоя воля. это простой вариант. более сложный - это когда идет рассылка по нескольким клиентам. но это отдельная тема. никакого буфера не требуется и никаких таймеров для забора из этого буфера ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 17:14 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
вадя похоже ты совсем не понял что такое ws. серверная часть состоит из "слушателя порта ws" - т.е. одна точка входа. Код: java 1. 2. 3.
в этом методе ты можешь распарсить String data выделить команду и передать управление методу который соответствует этой команде и соответственно передать сами данные , а так же передать Session userSession , как правило клиенту надо ответить (что не обязательно). а как метод/команда будет работать - это уже твоя воля. это простой вариант. более сложный - это когда идет рассылка по нескольким клиентам. но это отдельная тема. никакого буфера не требуется и никаких таймеров для забора из этого буфера Возможно, я неправильно объяснил суть. Буфер нужен для того, чтобы не лазить каждый раз в БД. То есть безотностительно с WS работа или по HTTP. То есть оперативная информация на клиент уходит только из буфера. И обновление этой информации идет централизованно приложением и может идти в один поток в том числе, то есть не зависит от пользователей. То есть: 1. идет некий процесс в приложении 2. данные из п.1 фиксируются в БД 3. по этим данным обновляется буфер 4. при обновлении буфера идет рассылка клиентам. 5. если подключается новый клиент, он не идет в БД, а забирает данные из буфера приложения В целом от этого пока можно абстрагироваться, так как не касается сути вопроса по большому счету. Что касается работы с WS-ми, да, точка входа одна: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Но как понимаю, здесь это для разработчика использующего javax.websocket она одна, но на входе есть Session - который и отражает собственно коннект по WS, и каждый клиент - это как минимум, один коннект. Или я не прав? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 17:49 |
|
Раздушить по количеству WebSocket подключений
|
|||
---|---|---|---|
#18+
JDS Буфер нужен для того, чтобы не лазить каждый раз в БД. JDS То есть безотностительно с WS работа или по HTTP. JDS Но как понимаю, здесь это для разработчика использующего javax.websocket она одна, но на входе есть Session - который и отражает собственно коннект по WS, и каждый клиент - это как минимум, один коннект. Или я не прав? ) вот только это Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
введёт в ступор тех кто будет разбираться в коде после тебя. я бы рекомендовал типа такого Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
счас у тебя получается Что сообщение от каждого рассылается каждому и Figure figure что это? ws понимает строковые и бинарные данные (по умолчанию) или ты используешь какой-то подпротокол? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2020, 18:17 |
|
|
start [/forum/topic.php?fid=59&msg=39937324&tid=2120871]: |
0ms |
get settings: |
25ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
434ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 550ms |
0 / 0 |