Я пишу игровой сервер для пошаговой игры на Java.Вот факты:
- Скорость игры низкая, поэтому клиенты должны отправлять данные, скажем, каждые 8 секунд, и эти данные в большинстве случаев являются лишь небольшим инкрементным обновлением (несколькодюжина байт), кроме ситуаций, таких как присоединение к игре или список доступных игр и т. д.
- Сервер должен поддерживать большое количество игроков, скажем 1000, которые играют в одну из нескольких сотен игр
- Когда игрок делает ход, другие игроки в той же игре должны быть уведомлены о ходе.Максимальное количество игроков в игре составляет около 10
Прежде всего, я исключил UDP из своего списка опций, так как мне нужен надежный протокол, потому что в редких случаях мне действительно нужно отправлять некоторые данные, которые не могутумещаются в один пакет, и я не хочу беспокоиться о слиянии пакетов и подобных вещах, отслеживая порядок поступивших пакетов и другие вещи низкого уровня.
Таким образом, дилемма заключается в том, использовать ли TCP или HTTP.
Попытка TCP # 1
Соединение между клиентом и сервером (и наоборот).-верса) открыта все время.Таким образом, когда игрок делает ход, сервер может легко уведомить других игроков в игре, какой ход был сделан.Главное, что меня беспокоит при таком подходе, - это целесообразно или вообще возможно иметь до 1000 соединений и сокетов постоянно открытыми?
TCP попытка # 2
Альтернатива, о которой я подумал, заключается в использовании отдельного соединения / сокета при каждом запросе от клиента.Клиент откроет соединение, отправит небольшие данные на сервер и закроет это соединение.При таком подходе я могу иметь пул потоков фиксированного размера, скажем, 10, и обрабатывать запросы клиентов в каждом потоке отдельно, так что в любой момент может быть открыто не более 10 разъемов / сокетов.Но есть две вещи, которые меня беспокоят таким подходом:
- дороговизна открытия / закрытия соединения с клиентом
- способ уведомления других игроков в игре, так как соединениедля них, скорее всего, закрыт.Каждый из них должен в этом случае «опросить» сервер на предмет обновления, скажем, каждую секунду.
Какова стоимость установления сокета / соединения TCP?Это дорогостоящая операция или она выполняется всего за несколько мс (или меньше)?
HTTP
- Было бы много служебных данных, если бы ябудет отправлять новый GET / POST просто для отправки нескольких байтов?
- Могу ли я сохранить 1000 HTTP-подключений к клиентам одновременно, а затем использовать AJAX или аналогичные вещи для уменьшения накладных расходов?В таком случае, будет ли 1000 одновременных подключений представлять значительную проблему в отношении пропускной способности / производительности?
Я открыт для предложений / рекомендаций любого рода.