Поток на соединение против одного потока для всех соединений в java

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

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

мой второй сервер использует java nio, чтобы использовать только один поток для всех соединений и использовать select для их прокрутки. этот сервер также использует ObjectOutputStream для отправки данных

на мой вопрос, что было бы лучшим подходом к серверу MMO, и если модель с одним потоком лучше, как это повлияет на отправку объекта по каналу сокета, не будет ли он полностью прочитан и не получит полный объект?

для каждого отправляемого объекта просто содержит, например, int и 2 числа с плавающей запятой для отправки позиции и идентификатора игрока.


person Arcxz    schedule 29.12.2017    source источник
comment
@Vimal, можете ли вы объяснить, почему это было бы лучше, из того, что я читал, поток на соединение - не очень хорошая идея, потому что много потоков - это плохо. это уже не так?   -  person Arcxz    schedule 29.12.2017
comment
Почему бы не провести стресс-тест и не проверить производительность каждой альтернативы?   -  person Yoav Gur    schedule 29.12.2017
comment
100 игроков одновременно - это ничто. Начните с потоков и переключайтесь на NIO, только если вы обнаружите, что у вас есть проблема, или если вы испытываете огромный рост. NIO с селекторами вступает в игру только с десятками тысяч соединений, если вообще когда-либо, и вы обнаружите, что версия java.net намного проще в написании и обслуживании.   -  person user207421    schedule 29.12.2017
comment
@YoavGur из моего тестирования, они оба кажутся примерно одинаковыми, ни один из них не имеет очевидного преимущества перед другим.   -  person Arcxz    schedule 29.12.2017
comment
@Arcxz слишком много потоков зависит от пика вот обсуждение, если размер пика велик вы можете использовать пул потоков, это здорово.   -  person Vimal    schedule 29.12.2017


Ответы (1)


Я свяжу этот вопрос с тем, почему ММО используют UDP через TCP. Причина в том, что UDP обещает быструю доставку, тогда как TCP обещает гарантированную доставку.

Аналогичная аналогия может быть применена к однопоточной и многопоточной модели. Независимо от того, что вы выберете, общие циклы вашего ЦП остаются неизменными, т. Е. Сервер может обрабатывать только определенное количество информации в секунду. Давайте посмотрим, что происходит в каждом из этих сценариев.

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

  1. Многопоточная модель. В этом случае, в зависимости от того, как ваша собственная реализация или базовая библиотека реализуют многопоточность, начнется параллельное выполнение запросов. Подвох МТ в том, что его легко обмануть. Например, java.util.concurrent.ThreadPoolExecutor на самом деле не выполняет никакой параллельной обработки, если только вы не установите маленькое значение размера очереди. Как только начнется параллельная обработка, при минимальной нагрузке ваше выполнение будет сверхбыстрым, а загрузка ЦП будет оптимальной, а производительность игры будет отличной. Однако при максимальной нагрузке использование оперативной памяти будет высоким, а загрузка ЦП по-прежнему будет оптимальной. Обычно вам нужно прерывать потоки, чтобы медленный клиент не перехватывал все потоки, что будет означать сбои в работе для медленного клиента. Кроме того, когда вы начнете истощать свой пул потоков и ресурсы, потоки либо будут поставлены в очередь, либо просто будут удалены, что приведет к сбоям в работе.

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

person Monish Sen    schedule 29.12.2017
comment
это звучит как ответ, который я искал, и я планировал добавить udp в микс после того, как решил использовать tcp, чтобы использовать tcp только для важных пакетов. - person Arcxz; 29.12.2017