Эффективный способ обработки множества потоков одного приложения - PullRequest
0 голосов
/ 27 апреля 2018

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

В клиентском приложении клиентский сокет подключается к серверу и периодически отправляет данные на сервер.

В сокете сервера приложений сервера прослушивается подключение к клиенту. Когда клиент подключен, создается новый поток для клиента для получения данных.

например: 1 клиент = 1 поток, созданный сервером для получения данных. Если его клиент 10000, сервер создает 10000 потоков. Это кажется не очень хорошим и масштабируемым тоже.

Мое приложение на Java.

Есть ли альтернативный метод для этой проблемы?

Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 29 апреля 2018

Я бы сказал, что это идеальный кандидат для приложения Erlang / Elixir. Whatsapp, RabbitMQ ...

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

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

Что ты пишешь?

0 голосов
/ 27 апреля 2018

Это типичная C10K проблема. Существуют шаблоны для решения этой проблемы, например: Шаблон реактора

Java NIO - это еще один способ обработки входящего запроса неблокирующим способом. См. Справочную реализацию здесь

0 голосов
/ 27 апреля 2018

Да, вы можете использовать модель актера, например, Акка или Акка.net. Это позволяет создавать миллионы актеров, которые работают, например, на 4 темы. Erlang - это язык программирования, который изначально реализует модель актера.

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

Существует также довольно интересный подход, который использует Haskell, называемый зелеными нитями. Это означает, что потоки времени выполнения очень легкие и динамически отображаются на потоки ОС. Это также означает, что вы получаете определенную степень масштабируемости «бесплатно» без необходимости писать неблокирующий код ввода-вывода. Однако для эффективного планирования операций ввода-вывода требуется хороший менеджер ввода-вывода, и в последние годы GHC Haskell был проделан значительный объем работы.

0 голосов
/ 27 апреля 2018

Да, вам не нужен отдельный поток для каждого клиента. Здесь есть хороший учебник , в котором объясняется, как использовать await для обработки асинхронных сокетов. Как только вы получаете данные через сокет, вы можете использовать фиксированное количество потоков. Учебное пособие также охватывает методы обработки тысяч одновременных сообщений.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...