Программирование на сокете - запрашивает ли очередь сервера? - PullRequest
0 голосов
/ 01 октября 2018

Я недавно работаю над программированием сокетов на Java, и что-то меня смущает.У меня есть три вопроса по этому поводу.

Первый:

В Java есть метод ServerSocket.И этот метод может принимать до 3 параметров, таких как port, backlog и ip address.Отставание означает количество клиентов, которые могут подключаться в виде очереди к серверу.Теперь давайте подумаем над этой ситуацией.

Что произойдет, если 10 клиентов попытаются подключиться к этому серверу одновременно?

Отбрасывает ли сервер последние 5 клиентов, которые пытались подключиться?Позволяет увеличить количество клиентов до 1 миллиона в час.Как я могу справиться со всеми из них?


Второй вопрос:

Может ли клиент отправлять сообщения одновременно, не ожидая ответа сервера?Что произойдет, если клиент отправит 5 сообщений на сервер, имеющий размер 5 невыполненных заданий?


Последнее действительно не является вопросом .У меня есть план управления балансировкой нагрузки.Предположим, у нас на компьютере запущено 3 сервера.

Пусть имена серверов A, B и C, и оба они работают без сбоев.Согласно моему плану, если я дал им приоритет в соответствии с входящими сообщениями, то наименьший приоритет означает самый доступный сервер.Например;

Начальные приоритеты -> A (0), B (0), C (0) и время ответа - в конце единицы времени.

1.Message -> A (1), B (0), C (0)

2. Сообщение -> A (1), B (1), C (0)

3. Сообщение -> A (1), B (1), C (1)

4.Message -> A (2), B (1), C (1)

5.Message -> A (2), B (2), C (1)

6. Сообщение -> A (1), B (2), C (2)

.,.

Хороша ли эта логика?Бьюсь об заклад, есть гораздо лучшая логика.Что мне делать, чтобы обрабатывать более или менее нескольких миллионов запросов в день?

PS: Вся эта логика будет реализована в проекте Java Spring-Boot.

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Итак, для вашего первого вопроса очередь ожидания - это то, где клиенты будут находиться в ожидании, если вы заняты обработкой других вещей (например, IO с уже подключенным клиентом).Если список выйдет за рамки невыполненных, этим новостным клиентам будет отказано в соединении.Вы должны быть в порядке с 10 клиентами, подключенными одновременно.Это долгое обсуждение, но сохраните пул потоков, как только вы получите подключенный сокет от accept, передадите его в свой пул потоков и вернитесь к ожиданию в accept.Вы не можете поддерживать миллионы клиентов "практически" на одном сервере!Вам нужно будет загрузить баланс.

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

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

С учетом всего вышесказанного, не изобретайте колесо :), есть несколько java-серверов с открытым исходным кодом, мой любимый: https://netty.io/

0 голосов
/ 01 октября 2018

Что произойдет, если 10 клиентов попытаются подключиться к этому серверу одновременно?

Javadoc объясняет это:

Аргумент backlog является запрошенныммаксимальное количество ожидающих соединений на сокете.Его точная семантика зависит от конкретной реализации.В частности, реализация может навязать максимальную длину или может игнорировать параметр altogther.

.

Позволяет увеличить количество клиентов до 1 миллиона в час,Как я могу справиться со всеми из них?

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

Может ли клиент отправлять сообщения одновременно, не ожидая ответа сервера?

Да.

Что произойдет, если клиент отправит 5 сообщений на сервер с размером 5 невыполненных заданий?

Отправка сообщений не имеет отношения кделать с размером отставания.Отставание для ожидающих соединений .Сообщения можно отправлять только после подключения.

Вся эта логика будет реализована в проекте Java Spring-Boot.

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

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