Azure: советы по созданию масштабируемой простой многопользовательской карточной игры - PullRequest
0 голосов
/ 09 февраля 2010

У меня на Facebook есть многопользовательская карточная игра (до 4 игроков могут играть в один и тот же экземпляр игры). Игра небольшая и размещена на одном сервере. Сейчас я смотрю на масштабируемость и надеюсь, что скоро одного сервера будет недостаточно.

Сервер хранит в памяти список всех происходящих игр: List<Game>

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

Какой подход вы бы порекомендовали мне использовать в Azure? Мой главный приоритет - быстрое реагирование на запросы клиентов и недопущение постоянного опроса клиентов.

С моим ограниченным знанием Azure я собираюсь пойти по этому пути:

Храните игры в хранилище Azure Table, а не в памяти.

Это будет сделано в веб-ролике: ПСЕВДОКОД:

void Page_LoadOfAnAspxPage
{
 // deserialze the message from the posted information
 Message msgClient = ...;

 // retrieve game from table storage
 Game g = RetrieveFromTableStorage(gameGuid);

 // post message to game
 g.ProcessClientMessage(msgClient);

 // save back to table storage so other game clients can be aware of new state
 SaveToTableStorage(gameGuid, g);

 // now wait until another client modifies the game
 while(true)  // will I be incurring hosting charges (transactions for what is going on in this while loop)???
 {
  // grab game from table storage
  g = RetrieveFromTableStorage(gameGuid);

  // has something changed?
  MsgResponse response = g.ProcessClientMessage(msgClient);
  if (response.ActionName != ActionName.GameHasNotChanged)
  {
   // some other client changed the game.
   // give this response back to our client
   break;  
  }
  // sleep a little and check again...
  Sleep(xx);
 } 
}

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

Спасибо!

сантьяго

1 Ответ

0 голосов
/ 12 февраля 2010

Посмотрите на возможность Silverlight Duplex. Это распределяет нагрузку / вычислительную мощность клиентам Silverlight, а не на сервере, без необходимости управлять собственным механизмом опроса.

Затем вы можете разместить логику в веб-ролике в форме службы WCF

http://silverlightforbusiness.net/2009/06/23/pushing-data-from-the-server-to-silverlight-3-using-a-duplex-wcf-service/

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