У меня есть многопользовательская карточная игра (до 4 игроков может играть один и тот же экземпляр игры) на facebook. Игра небольшая и размещается на одном сервере. Теперь я изучаю масштабируемость, поскольку я надеюсь, что скоро одного сервера будет недостаточно.Azure: советы по созданию простой многопользовательской карточной игры, масштабируемой
сервер хранит в памяти список всех игр, которые ведутся: List<Game>
Когда клиент делает запрос (например, бросает карты) он отправляет сообщение на сервер. Теперь вот сложная часть. Сервер не отправляет ответ немедленно, а проверяет, изменил ли какой-либо другой игрок состояние игры до того, как он ответит. Этот подход работает очень хорошо, потому что клиент (silverlight) не постоянно проводит опрос сервера.
Какой подход вы бы порекомендовали в Azure? Мой главный приоритет - быстро реагировать на клиентов и избегать постоянного опроса клиентов.
С моим ограниченного знанием Azure я имею в виду с этой дорогой:
магазин игры в лазурном хранении таблицы, а не в памяти.
Это будет сделано в WebRole: псевдокод:
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);
}
}
Верите ли вы этот подход будет работать? Какие препятствия я мог бы натолкнуться? Я был бы очень благодарен за любые предложения/улучшения.
Спасибо!
сантьяго