Существует ли концепция общих сеансов в ASP.NET? - PullRequest
3 голосов
/ 30 октября 2008

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

  • До шести пользователей могут использовать один объект состояния игры.
  • Пользователям необходимо (относительно) быть в курсе текущего состояния игры, то есть чья это очередь, что только что бросил активный пользователь, сколько денег у каждого другого пользователя и т. Д.

Я думал о том, чтобы сохранить состояние игры в базе данных, но кажется излишним обновлять базу данных, когда объект состояния игры (скажем, в кеше) можно поддерживать в актуальном состоянии. Например, поток может идти так:

  1. Получение запроса данных от пользователя.
  2. Поиск данных в базе данных. Создать объект из этих данных.
  3. Убедитесь, что у пользователя есть разрешения на выполнение запроса в зависимости от состояния игры (т.е. убедитесь, что это действительно их очередь или у него достаточно денег, чтобы купить эту собственность).
  4. Обновление игрового объекта.
  5. Запись игрового объекта обратно в базу данных.
  6. Повторите для каждого запроса.

Учтите, что один сервер будет обслуживать несколько одновременных игр.

  1. Я думал об использовании AJAX для отправки запросов на страницу ASP.NET.
  2. Я думал об использовании запросов AJAX для веб-службы с использованием silverlight.
  3. Я думал об использовании дуплексных каналов WCF в Silverlight.

Я не могу понять, каков наилучший подход. У всех, похоже, есть свои недостатки. Есть ли у кого-нибудь опыт такого рода вещей, и он хочет поделиться этим опытом? Не стесняйтесь задавать свои вопросы, если я слишком двусмысленен! Спасибо.

Обновление: есть ли у кого-нибудь предложения о том, как реализовать это подключение к серверу на основе трех упомянутых выше вариантов?

Ответы [ 3 ]

4 голосов
/ 30 октября 2008

Вы можете использовать ASP.Net Cache или состояние приложения для хранения игрового объекта, поскольку они совместно используются пользователями. Кэш, вероятно, будет лучшим местом, поскольку объекты могут быть удалены из него для экономии памяти.

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

3 голосов
/ 30 октября 2008

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

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

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

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

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

Наконец, поскольку на сервере действительно «одно истинное» игровое состояние, клиенты могут периодически сверяться с этим (что позволит вам находить ошибки в коде вашего клиента или сервера). Поскольку серверная база данных должна считаться основной, вы можете повторно передать все игровое состояние любому клиенту, который получает неправильное состояние, поэтому незначительные ошибки клиента (потенциально) не разрушат работу (за исключением, возможно, паузы, пока загружается состояние).

1 голос
/ 30 октября 2008

Почему бы вам просто не создать объект уровня приложения для хранения ваших данных. Подробнее см. Состояние приложения и глобальные переменные в ASP.NET . Вы можете использовать sessionID в качестве ключа для данных для каждого игрока.

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

...