Я проектирую архитектуру для приложения для Android -> связь с сервером по TCP .Это будет собственный протокол приложения, основанный на TCP ... Я знаком с сетевым программированием, но я мало работал с Java (даже, это более общий вопрос, чем вопрос Java) - и я не работал многос приложениями, где у вас есть неопределенное количество клиентов (в этом случае, в зависимости от того, сколько у вас пользователей приложений Android). Поэтому у меня мало сомнений и вопросов.
Сценарий:
- Пользователи собираются установить приложение для Android и войти в систему
- После входа ониустановит TCP-соединение с сервером
- Очевидно, что реализация на стороне сервера должна обрабатывать запросы в paralel
- Учтите, что как на стороне клиента, так и на стороне сервера будет реализовано использование Java
- .Считайте, что приложение действительно успешно - и оно имеет 3 миллиона установок +, что означает много пользователей (да, верно :))
Вопрос: Как лучше (лучше всего)практиковать) реализовать серверную часть для обработки клиентских подключений для этого типа приложений?
Основываясь на моих исследованиях, у вас есть только три возможных подхода:
- Использование пула потоков
- Использование одного потока на соединение tcp
- Использование пула потоков и неблокирующего асинхронного подхода в Java (аналогично тому, что nodejs делает с libuv)
РЕДАКТИРОВАТЬ:
Разработка:
1.Использование только пула потоков здесь кажется "странным" из-за того, что нам нужно иметь огромный пул потоков, чтобы иметь возможность назначать поток на соединение tcp.Использование пула потоков для обслуживания, например, http-запроса (где соединение tcp будет закрыто после завершения запроса), кажется более чем отличной идеей ... но не для соединений tcp, которые будут использоваться в течение более длительного времени)
2.Создание одного потока на соединение tcp каждый раз - кажется ограниченным ( Почему создание потока называется дорогим? )
Потоки Java реализованы как собственныепотоки и огромное количество потоков - это неправильный способ написания практического Java-приложения. Полагаю, это зависит, конечно, и от того, какой тип приложения у вас вообще.
3.Использование пула потоков и неблокирующего асинхронного подхода в java (аналогично тому, что nodejs делает с libuv).
Исходя из того, что я прочитал (и также предлагал до сих пор), это кажется лучшим подходом.Может быть, это просто потому, что у меня больше опыта работы с такими приложениями (nodejs не блокирует однопоточных рабочих), но кажется лучшим решением.
Может быть, есть несколько способов - методов, с которыми я не знаком - которые могутсделать этот процесс более эффективным?
Можете ли вы предложить какие-либо ресурсы (книги или аналогичные) для приложений такого типа?
ПРИМЕЧАНИЕ. Пожалуйста, запишите, как я понимаю, что я могу сделатьэтот процесс более эффективен с помощью нескольких методов, с которыми я уже знаком - например, закрытие tcp-соединения, когда приложение переходит в фоновый режим, - и повторное подключение / установление, когда пользователь снова использует приложение и тому подобное (но это, конечно, зависит от самого приложения).
Мне интересно, я что-то здесь упускаю - или это просто так, как есть.Если вы хотите иметь много пользователей - и множество соединений tcp - вам нужно будет использовать один поток для каждого отдельного пользователя (или других подходов, которые я упомянул выше).
Другие ресурсы, через которые я прошел:
- Максимальное количество потоков - Linux
- Увеличение количества потоков - JVM
- Максимальное количество потоковразрешено запускать
Runnable vs Thread
... и другие внешние ресурсы