У меня на 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);
}
}
Верите ли вы, что этот подход будет работать? Какие-нибудь контрольно-пропускные пункты, с которыми я мог бы столкнуться?
Буду очень признателен за любые предложения / улучшения.
Спасибо!
сантьяго