Написание Java-сервера для обработки нескольких одновременных клиентов - PullRequest
3 голосов
/ 11 апреля 2011

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

Я нашел несколько вариантов, включая использование Selector или Executor с пулами потоков фиксированного размера. Я не слишком знаком с любым из них, так что будет лучшим решением здесь? Спасибо!

Ответы [ 4 ]

1 голос
/ 11 апреля 2011

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

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

Существуют фреймворки / серверы, которые уже написаны для обработки такого рода событийно-ориентированного проектирования. Посмотрите на:

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

0 голосов
/ 11 апреля 2011

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

Горизонтальная масштабируемость (http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_vs._vertically) вашего приложения не будет зависеть ни от одного из этих вариантов.

0 голосов
/ 11 апреля 2011

Есть много рамок для такой работы, примеры

  1. Нетти
  2. Apache MINA
0 голосов
/ 11 апреля 2011

с использованием нескольких потоков является масштабируемым.Например, Apache делает это, и некоторые сайты, использующие его, получают много посетителей.Тем не менее, другой подход действительно мог бы использовать селектор, хотя у меня нет опыта его использования.

В конце концов, это кажется вопросом, какая религия лучшая.

...