Как синхронизировать список на сервере со многими клиентами? - PullRequest
1 голос
/ 29 апреля 2009

Рассмотрим покерный игровой сервер, на котором размещено много столов. Пока игрок в лобби, у него есть список всех активных столов и их статистика. Эта статистика постоянно меняется, пока игроки присоединяются, играют и покидают столы. Таблицы могут быть добавлены и закрыты. Так или иначе, эти изменения должны быть уведомлены клиентам.

Как бы вы реализовали эту функцию? Будете ли вы использовать TCP / UDP для лобби (то есть, должны ли пользователи подключаться к серверу для наблюдения за лобби, или вы будете использовать механизм запрос-ответ)? Будет ли сервер уведомлять клиентов о каждом событии или клиент должен опросить сервер?

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

Ответы [ 2 ]

1 голос
/ 29 апреля 2009

Эта конкретная проблема является проявлением очень простой проблемы в дизайне вашего приложения - как клиенты должны подключаться к серверу.

Когда масштабируемость является проблемой, всегда прибегайте к масштабируемому решению, используя неблокирующие шаблоны ввода / вывода, такие как шаблон проектирования Reactor . Гораздо предпочтительнее использовать стандартные решения, которые уже имеют работающую и проверенную реализацию таких шаблонов.

В конкретном случае, когда речь идет о быстродействующей игре, которая постоянно обновляется, разумно использовать масштабируемый сервер (опять же, неблокирующий ввод / вывод), который удерживает соединение с каждым клиентом через TCP, и сообщает ему информацию, которую он должен знать.

Цикл «запрос-ответ» звучит менее подходящим для вашего случая, но это должно быть сверено с вашими точными спецификациями для вашего приложения.

0 голосов
/ 29 апреля 2009

Это мое основное предложение:

Сервер обновляет список (добавление, удаление и изменение существующих элементов) через интерфейс, который поддерживает очередь с фиксированной длиной операций, которые были применены к списку. Каждой операции присваивается метка времени. Когда очередь заполнена, самые старые операции постепенно удаляются.

Когда пользователю сначала нужно получить список, он просит сервер отправить ему полный список. Сервер отправляет список с текущей отметкой времени.

Один раз в произвольный период времени (10-30 секунд?) Клиент просит сервер отправить ему все операции, которые были применены к списку с момента получения им временной отметки. Затем сервер проверяет, отображается ли отметка времени в списке (то есть превышает ли она отметку времени первого элемента), и, если да, отправляет клиенту список операций, которые произошли с того времени до настоящего времени, плюс текущая метка времени. Если он слишком старый, сервер снова отправляет полный список.

Похоже, что UDP подходит для этого подхода, так как он не очень важен, если время от времени теряется "цикл обновления".

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