Обработка клиента -> соединения с сервером (максимальное количество и лучшие практики) - PullRequest
4 голосов
/ 30 июня 2019

Я проектирую архитектуру для приложения для Android -> связь с сервером по TCP .Это будет собственный протокол приложения, основанный на TCP ... Я знаком с сетевым программированием, но я мало работал с Java (даже, это более общий вопрос, чем вопрос Java) - и я не работал многос приложениями, где у вас есть неопределенное количество клиентов (в этом случае, в зависимости от того, сколько у вас пользователей приложений Android). Поэтому у меня мало сомнений и вопросов.

Сценарий:

  • Пользователи собираются установить приложение для Android и войти в систему
  • После входа ониустановит TCP-соединение с сервером
  • Очевидно, что реализация на стороне сервера должна обрабатывать запросы в paralel
  • Учтите, что как на стороне клиента, так и на стороне сервера будет реализовано использование Java
  • .Считайте, что приложение действительно успешно - и оно имеет 3 миллиона установок +, что означает много пользователей (да, верно :))

Вопрос: Как лучше (лучше всего)практиковать) реализовать серверную часть для обработки клиентских подключений для этого типа приложений?

Основываясь на моих исследованиях, у вас есть только три возможных подхода:

  1. Использование пула потоков
  2. Использование одного потока на соединение tcp
  3. Использование пула потоков и неблокирующего асинхронного подхода в Java (аналогично тому, что nodejs делает с libuv)

РЕДАКТИРОВАТЬ:

Разработка:

1.Использование только пула потоков здесь кажется "странным" из-за того, что нам нужно иметь огромный пул потоков, чтобы иметь возможность назначать поток на соединение tcp.Использование пула потоков для обслуживания, например, http-запроса (где соединение tcp будет закрыто после завершения запроса), кажется более чем отличной идеей ... но не для соединений tcp, которые будут использоваться в течение более длительного времени)

2.Создание одного потока на соединение tcp каждый раз - кажется ограниченным ( Почему создание потока называется дорогим? )

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

3.Использование пула потоков и неблокирующего асинхронного подхода в java (аналогично тому, что nodejs делает с libuv).

Исходя из того, что я прочитал (и также предлагал до сих пор), это кажется лучшим подходом.Может быть, это просто потому, что у меня больше опыта работы с такими приложениями (nodejs не блокирует однопоточных рабочих), но кажется лучшим решением.

Может быть, есть несколько способов - методов, с которыми я не знаком - которые могутсделать этот процесс более эффективным?

Можете ли вы предложить какие-либо ресурсы (книги или аналогичные) для приложений такого типа?

ПРИМЕЧАНИЕ. Пожалуйста, запишите, как я понимаю, что я могу сделатьэтот процесс более эффективен с помощью нескольких методов, с которыми я уже знаком - например, закрытие tcp-соединения, когда приложение переходит в фоновый режим, - и повторное подключение / установление, когда пользователь снова использует приложение и тому подобное (но это, конечно, зависит от самого приложения).

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

Другие ресурсы, через которые я прошел:

  1. Максимальное количество потоков - Linux
  2. Увеличение количества потоков - JVM
  3. Максимальное количество потоковразрешено запускать
  4. Runnable vs Thread

  5. ... и другие внешние ресурсы

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