Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP-сервер и много подключений, обработка большого количества коннектов 
V
    Опции темы
kometa_75
Дата 4.3.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.10.2007

Репутация: нет
Всего: нет



Всем привет. Имеется несколько тысяч TCP-подключений. Проблема в эффективной обработке входящих сообщений. Т.е. хочется делать это, не перебирая в цикле весь массив сокетов и не использовать по каждому потоку на один коннект.
На плюсах использовал мультиплексированный ввод/вывод(epoll/kqueue). Может в джаве есть что-нибудь подобное ? Или есть другие средства ?
ЗЫ. В java работаю недавно (и не от хорошей жизни), поэтому просьба не пинать.
PM MAIL   Вверх
SoulKeeper
Дата 4.3.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: нет
Всего: 15



google -> NIO smile.

Если нетвозможности\влом самому программить нио, то можно использовать Apache Mina

Это сообщение отредактировал(а) SoulKeeper - 4.3.2008, 16:15
PM MAIL   Вверх
kometa_75
Дата 4.3.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.10.2007

Репутация: нет
Всего: нет



Цитата(SoulKeeper @ 4.3.2008,  16:15)
google -> NIO smile.

Похоже, что NIO - это то что мне надо. В частности "Multiplexed, non-blocking I/O". Может кто-нибудь пользовался ? Буду очень признателен за пример рабочего кода.
PM MAIL   Вверх
serger
Дата 5.3.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: нет
Всего: 5



Цитата(kometa_75 @ 4.3.2008,  16:05)
ЗЫ. В java работаю недавно (и не от хорошей жизни), поэтому просьба не пинать.

Пинать не за что, но интересно, что так?


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
kometa_75
Дата 6.3.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 24.10.2007

Репутация: нет
Всего: нет



Цитата(serger @ 5.3.2008,  11:50)
Цитата(kometa_75 @ 4.3.2008,  16:05)
ЗЫ. В java работаю недавно (и не от хорошей жизни), поэтому просьба не пинать.

Пинать не за что, но интересно, что так?

Собственно, если вкратце, то руководство захотело посмотреть, как будет работать сервер, написанный на сях, если его переписать на java.
От себя добавлю, что первые наработки показали очень хороший результат. Сетевая часть получилась достаточно производительной. Код действительно получается безопасный и стабильный. С волнением жду, что будет при больших critical time вычислениях.
ЗЫ. Сорри за оффтоп. 

Это сообщение отредактировал(а) kometa_75 - 6.3.2008, 11:40
PM MAIL   Вверх
serger
Дата 6.3.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: нет
Всего: 5



Чесно говоря, есть о чём волноваться.. Когда что-то насильно навязывают без конкретных аргументов и при отсутсвии специалистов, к хорошему это не приводит.
Имхо по сравнению с нативной реализацией сетевых протоколов на ява писать одно удовольствие, правда возможностей по-меньше.
От себя пожелаю удачи и успеха и роста проекта!


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
nucer
Дата 12.8.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 21.6.2004
Где: Москва

Репутация: нет
Всего: 0



В общем интересует тот же вопрос - как сделать риал-тайм сервер, который бы держал несколько тысяч клиентов... Если для 1-2000 ещё можно вешать каждого на отдельный поток и делать в нём read(), то дальше вроде начинаются ограничения ОС на кол-во потоков...

Предположим есть модель клиент-сервер, где потоки данных построены на пакетах - клиент посылает некий кусок данных, в начале которого идёт 4 байта int с указанием длины пакета. По прочтении нужного количества байт формируется клиент-пакет и отдаётся в обработку пулу потоков обработчиков пакетов... Далее асинхронно формируется сервер-пакет и добавляется в очередь для отправки клиенту.

Как реализовать такую модель, подскажите пожалуйста, буду очень благодарен!! Коммерческой необходимости реализации пока нет, но вопрос "как" не даёт покоя уже которую неделю))

Почитал про NIO... Очень мало понял...
Смотрю пример...
Код

ServerSocketChannel ssc = ServerSocketChannel.open();

ServerSocketChannel это ведь абстрактный класс?.. Каким образом тут его экземпляр создаётся, или я что то совсем упустил?... Или же там есть недокументированные классы, которые расширяют абстрактные из nio и возвращаются именно их экземпляры??.. 

Смотрю ещё пример
Тоже ничего не могу понять - там ведь идет всё тот же бесконечный цикл с перебором (отличие только в том, что перебираются не все, а только свободные)?... Каким образом сигнализируется о том, что в буфер считано нужное количество байт? Ничего похожего на систему событий не заметил...
Объясните плиз как же всё-таки пользоваться этим NIO... Буду очень благодарен (и думаю что не я один), если кто-нибудь напишет нормальным человеческим языком логическую последовательность реализации описанной модели с указанием классов, которые надо использовать и комментариями...
PM MAIL   Вверх
COVD
Дата 21.8.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Каким образом тут его экземпляр создаётся

open() возвращает дефолтную имплементацию

Цитата

всё тот же бесконечный цикл с перебором (отличие только в том, что перебираются не все, а только свободные)?... 

когда один поток обслуживает все соединения (NIO), то никак, кроме как в цикле, это не реализуешь. Преимущество по сравнению с многопоточной схемой в том, что не все каналы имеют данные для чтения или записи, т.е. количество селектированных каналов существенно меньше, чем общее число каналов. Иными словами, большая часть каналов простаивает. Если же не простаивает, то многопоточный вариант, возможно, не хуже.

Цитата

Каким образом сигнализируется о том, что в буфер считано нужное количество байт? 

это реализуется программистом поскольку это уже протокол уровня приложения.
PM MAIL   Вверх
fjfalcon
Дата 29.8.2011, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 10.3.2009

Репутация: нет
Всего: нет



Посмотрите в сторону apache mina, это отличный сетевой фреймворк, вам останется только написать свой протокол и можно запускать в продакшен.
PM MAIL   Вверх
nucer
Дата 30.8.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 21.6.2004
Где: Москва

Репутация: нет
Всего: 0



Цитата

Посмотрите в сторону apache mina, это отличный сетевой фреймворк, вам останется только написать свой протокол и можно запускать в продакшен.

Спасибо за совет! Уже прочитал, как только увидел про него ссылку в этой же теме... Но, увы, не понимая принципа работы того, на чём написан этот фреймворк не вижу возможности его использовать!)

Цитата

когда один поток обслуживает все соединения (NIO), то никак, кроме как в цикле, это не реализуешь. Преимущество по сравнению с многопоточной схемой в том, что не все каналы имеют данные для чтения или записи, т.е. количество селектированных каналов существенно меньше, чем общее число каналов.

Если я правильно понял, то при чтении даже с канала имеющего данные от пользователя операция будет произведена без блокировки? Но ведь в любом случае, будет задержка на операции с массивом байт, лежащим уже в памяти? Можно ли как то обеспечить обслуживание соединений несколькими потоками? Чтобы на один поток приходилось, к примеру, 10-20 клиентов?..

Цитата

Если же не простаивает, то многопоточный вариант, возможно, не хуже.

Но ведь, в любом случае, многопоточным вариантом не обслужить больше 2000 клиентов одновременно? Просто потоков не хватит...) И насколько сильные задержки будут возникать у юзеров при обработке NIO соединений одним потоком, при условии, что все каналы имеют данные (не простаивают).
PM MAIL   Вверх
COVD
Дата 30.8.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Если я правильно понял, то при чтении даже с канала имеющего данные от пользователя операция будет произведена без блокировки? Но ведь в любом случае, будет задержка на операции с массивом байт, лежащим уже в памяти? 

Блокировка - это простаивание потока на операции чтения. В НИО операция select возвращает список каналов, в которых в данный момент уже есть данные в буфере. В цикле один поток сначала делает select, потом читает из выбранных каналов. Поскольку данные приходят неравномерно, в разных циклах поток может читать из разных каналов.  

Цитата

Можно ли как то обеспечить обслуживание соединений несколькими потоками? Чтобы на один поток приходилось, к примеру, 10-20 клиентов?..

В НИО нельзя. Это промежуточный вариант между много- и одно- поточной схемами. Можно поставить много НИО серверов, каждый на 10-20 клиентов.

Цитата

Но ведь, в любом случае, многопоточным вариантом не обслужить больше 2000 клиентов одновременно? Просто потоков не хватит...) 

Ресурсы компьютера в любом случае ограничены. Он должен где-то брать входные данные, открывать-закрывать соединения. В многопоточной схеме каналы также обслуживаются последовательно. Вопрос сравнения эффективности переключения потоков с эффективностью select в одном потоке. А это зависит от природы данных. НИО однозначно эффективен, если данные неравномерные. А если это трансляция футбольного матча в реальном времени, то может и нет.


Цитата

И насколько сильные задержки будут возникать у юзеров при обработке NIO соединений одним потоком, при условии, что все каналы имеют данные (не простаивают). 


Пока не сделаете - не узнаете. Каналы обычно простаивают (с точки зрения компьютера и в силу природы интернета) Но это не столь важно. Важно уметь добавлять сервера при увеличении количества клиентов.  
PM MAIL   Вверх
Skipy
Дата 30.8.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Цитата(COVD @ 30.8.2011,  14:03)
Цитата

Можно ли как то обеспечить обслуживание соединений несколькими потоками? Чтобы на один поток приходилось, к примеру, 10-20 клиентов?..

В НИО нельзя. Это промежуточный вариант между много- и одно- поточной схемами. Можно поставить много НИО серверов, каждый на 10-20 клиентов.

С чего бы нельзя?

Один поток обрабатывает accept. После accept он отдает содинение на обработку другому потоку. Вот тут и можно балансировать, кому сколько отдавать. У меня так прокси написан - один поток на принятие соединений, второй на направление от клиента к серверу, третий - от сервера к клиенту. У каждого свой селектор. Всё прекрасно работает.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
COVD
Дата 30.8.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Действительно! Вы правы. После accept канал можно зарегистрировать в любом другом селекторе. Можно сделать 100 потоков обслуживающих 100 селекторов, в каждом по 10-20 каналов.  
PM MAIL   Вверх
Skipy
Дата 31.8.2011, 10:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Да можно-то можно. А смысл их делать больше чем ядер? smile


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Temdegon
Дата 31.8.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



Цитата

У меня так прокси написан - один поток на принятие соединений, второй на направление от клиента к серверу, третий - от сервера к клиенту.


Skipy, поделитесь сорсами прокси пожалуйста. Очень хочется посмотреть.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.