2009-03-31 4 views
8

Я могу создать несколько потоков для поддержки многоклиентской функции в программировании сокетов; это нормально работает. Но если 10 000 клиентов хотят подключиться, мой сервер не может создать столько потоков.Программирование на Java Socket не работает для 10 000 клиентов

Как я могу управлять потоками, чтобы одновременно слушать эти клиенты?

Кроме того, если в этом случае сервер хочет отправить что-то конкретному клиенту, то как это возможно?

+0

Это уже ответит: http://stackoverflow.com/questions/592303/asynchronous-io-in-java – mparaz

+0

Ниже приведены некоторые отличные рекомендации по NIB для NIO, но, ради обобщения, позвольте мне изложить это четко : Когда вы ожидаете нескольких клиентов, вы можете пойти по одному потоку на один сокет. Но когда вы ожидаете клиентов 10K, и я буду спорить (в зависимости от нагрузки ввода-вывода и процессора), если вы ожидаете чего-либо более 100 клиентов, вам НЕОБХОДИМО ПРОЙТИ НА НИХ-ПУТЬ (неблокирующий IO). Даже если ваша ОС упреждает 1000 раз в секунду, вы могли бы представить себе задачу обработки клиентов 10K? Не имеет смысла идти с блокировкой сокетов с таким количеством клиентов! – Jeach

ответ

1

Это не простой вопрос, но очень в глубине (к сожалению, не в Java, хотя) ответ увидеть это: http://www.kegel.com/c10k.html


EDIT

Даже с NiO, это все еще сложная проблема. 10000 соединений - огромная ресурсная нагрузка на машину, даже если вы используете неблокирующие сокеты. Вот почему на крупных веб-сайтах есть серверные фермы и балансировщики.

7

Высоко масштабируемое программирование сокетов на Java требует selectable channels, представленного в пакетах «Новый ввод-вывод» или NIO. Используя неблокирующий IO, один поток может обслуживать множество сокетов, ориентируясь только на те сокеты, которые готовы.

Одним из наиболее масштабируемых приложений с открытым исходным кодом NIO является компонент Grizzly сервера приложений Glassfish. Jean-Francois Arcand написал ряд подробных сообщений в блоге о своей работе над проектом и охватывает множество тонких подводных камней при написании такого программного обеспечения с помощью NIO.

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

11

Вы должны исследовать библиотеку Java NIO («Новый ввод-вывод») для неблокирующего сетевого программирования. NIO был разработан для решения точно проблемы с масштабируемостью сервера, с которой вы сталкиваетесь!

4

Нить-за подключения потоковая модели (Блокировка сокета ввода/вывода) не будет масштабироваться слишком хорошо. Вот введение в Java NIO, который позволит вам использовать не блокирующие вызовы сокетов в Java: http://today.java.net/cs/user/print/a/350

Как говорится в статье, есть много доступных инфраструктуры, поэтому вам не придется свернуть свой собственный.

+0

Спасибо, Peter, Его полезная ссылка.Можете ли вы мне помочь в таких типах ссылок, где я могу получить более подробную информацию. – 2009-03-31 05:37:04

+0

В этой модели есть образец кода в JDK. Примечание. Вы не можете превышать число пользователей, которых будет поддерживать ваш сервер. Возможно, вам понадобится больше серверов. –

1

Почему вы не обрабатываете только определенное количество запросов одновременно.

Допустим, вы хотите обработать максимум 50 запросов в то время (чтобы не создать слишком много потоков)

Вы создаете ThreadPool 50 потоков.

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

Это должно масштабироваться более легко.

Кроме того, если возникнет необходимость, то это будет легче сделать балансировку нагрузки, так как вы могли бы поделиться своими очередями для нескольких серверов

6

Преимущества NIO является спорным. Смотрите записи блога Пола Тимы here и here.

2

Как уже упоминалось, 10.000 клиентов не просто. Для java NIO (возможно, дополненный отдельным threadpool для обработки каждого запроса без блокировки потока NIO) является обычным способом обработки большого количества клиентов.

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

При этом NIO, как известно, трудно получить 100% прав при первом его осуществлении.

Я бы рекомендовал либо попробовать, либо хотя бы взглянуть на источник Naga NIO lib на naga.googlecode.com. Кодовая база для lib мала по сравнению с большинством других инфраструктур NIO. Вы должны иметь возможность быстро выполнить тест, чтобы узнать, сможете ли вы запустить и запустить 10 000 клиентов.

(Источник Нага также происходит свободно изменять или копировать без приписывания оригинального автора)

0

Лично я предпочел бы использовать создавать пользовательские I/O не настройки блокировки, например, с помощью одной нити принимать клиентов и используя один другой поток для их обработки (проверка наличия любого входа и запись данных на выход, если это необходимо).

0

Вам нужно выяснить, почему ваше приложение терпит неудачу при 10000 потоках.

  1. Есть ли жесткий предел количества потоков в JVM или ОС? Если да, то можно ли его снять?

  2. У вас заканчивается память? Попробуйте настроить размер меньшего стека на поток и/или добавить больше памяти на сервер.

  3. Что-то еще? Почини это.

Только после того, как вы определили источник проблемы, сможете ли вы это исправить. Теоретически 10 000 потоков должны быть в порядке, но на этом уровне параллелизма требуется некоторая дополнительная настройка JVM и операционной системы, если вы хотите, чтобы она работала.

Вы также можете рассмотреть NIO, но я думаю, что он отлично работает и с потоками.

+0

Мне сложно переваривать ваши комментарии (потоки 10K должны быть в порядке)? Я призываю вас написать небольшую программу, которая выполняет одну задачу. Отметьте это хорошо и сохраните это число в безопасности. Затем создайте потоки 10K и начните эту же задачу в каждом потоке, а также сравните ее. Независимо от того, какую ОС вы используете, у вас, вероятно, будет головоломка! – Jeach

+0

Привет, Jeach, задача здесь - «дождаться ввода/вывода», обработки нет. ОС не переключает контекст на потоки, ожидающие ввода-вывода. ОС не выделяет физическую память в области стека, которые не используются. –