Статьи

Для геймеров: создание простой таблицы лидеров с помощью хранилища Azure

Если вы занимаетесь разработкой мобильных приложений, скорее всего, вы потратили немало времени на размышления об услугах. Как я могу предоставить интересные данные пользователям моего приложения? Как я могу сохранять и обмениваться данными между пользователями? Традиционные решения включают поиск хостинг-провайдера, поддержку хостинга и написание сервисов. В облачных вычислениях барьер для входа ниже, однако во многих случаях вам все еще нужно кодировать уровень сервисов. Но в некоторых уникальных случаях может быть возможно решить вашу проблему с сервисом без написания ни одной строки кода на стороне сервера.  В этом примере я буду использовать хранилище Windows Azure и инструментарий Windows Azure для WP7создать таблицу лидеров (способ хранить и получать самые высокие баллы). Я сосредоточусь на основах и позволю вам добавлять дополнительные столбцы по мере необходимости. Для нашей таблицы лидеров нам понадобятся две основные операции:

  1. Возможность сохранить счет на сервере
  2. Возможность запрашивать 10 лучших, 20,… баллов

Вы можете быть удивлены, узнав, что это можно сделать с помощью хранилища Windows Azure. Пример кода проекта WP7 можно скачать здесь .

Предпосылки

Для запуска проекта вам понадобятся следующие инструменты:

  1. Комплект разработчика для Windows Phone ( http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27570)
  2. Windows Azure Toolkit для WP7
  3. Учетная запись Windows Azure с одной службой хранения. Вы можете подписаться на бесплатную 90-дневную пробную версию здесь http://www.microsoft.com/windowsazure/free-trial/

Шаг 1: определить класс домена для данных

Наша модель домена будет хранить счет и псевдоним игрока. Модель домена также должна предоставлять ключ раздела и ключ строки, как того требуют таблицы Azure. Мы воспользуемся тем, что ключи разделов хранятся в индексированном порядке от наименьшего к наибольшему.

public class Score : TableServiceEntity
{
private long p;
public Score() {}
public Score(long p)
{
this.p = p;
Value = p;
PartitionKey = (long.MaxValue - Value).ToString("d19");
}
public string Alias { get; set; }
public long Value { get; set; }
public override string ToString()
{
return Value + " (" + Alias + ")";
}
}

Ключ раздела и ключ строки наследуются от класса TableServiceEntity (часть инструментария). Вы заметили, как получается ключ раздела? Мы берем счет и вычитаем его из максимально длинного значения. Это гарантирует, что самые высокие баллы будут иметь самый маленький ключ раздела. Таким образом, наша учетная запись хранения Azure действует как приоритетная очередь. Когда мы запрашиваем оценки, они всегда возвращают самые высокие оценки, отсортированные в порядке убывания.

Шаг 2: создайте простой UX для проверки концепции

Хорошо, нужна кнопка для отправки случайных результатов и обеспечения таблицы данными. Нам также понадобится кнопка для запроса 10 лучших результатов. Наконец нам нужен список для отображения списка лидеров. Вот законченный UX. Смотрите код проекта для деталей.

 

Шаг 3: код операций для сохранения и запроса результатов

Давайте начнем с более простого случая запроса. Извлечение данных из таблиц Azure очень просто, и это особенно верно, когда мы используем инструментарий WP7, так как он поставляется с удобным клиентским API C #. (Таблицы Azure говорят на простом OData / Atom / Rest, чтобы вы могли назначить своего собственного клиента). В следующем коде вам нужно заменить «yourservice» на имя вашей учетной записи хранения Azure. Точно так же вам нужно будет указать свои учетные данные. Мы обсудим безопасность и защиту ваших учетных данных в следующем посте. Большая часть примера строит URI … это стандартные вещи REST. Базовым URI будет ваш аккаунт, взятый из объекта контекста, плюс имя таблицы «показателей», и, наконец, мы указываем количество возвращаемых элементов (10 в данном случае). Таким образом, в 14 строках кода у нас есть сервис с лучшими результатами.

TableServiceContext ctx = new TableServiceContext("https://yourservice.table.core.windows.net", creds);
CloudTableClient c = new CloudTableClient(ctx);
table = new DataServiceCollection(ctx);
table.LoadCompleted += this.OnTableLoaded;
var tableUri = new Uri(
string.Format(
CultureInfo.InvariantCulture,
"{0}{1}?incrementalSeed={2}&$top=10",
ctx.BaseUri,
"scores",
DateTime.UtcNow.Ticks),
UriKind.Absolute);
table.Clear();
table.LoadAsync(tableUri);

Теперь, когда мы решили восстановить результаты, нам нужно посмотреть на сохранение результатов. Этот пример просто генерирует случайную оценку от 0 до 1000. Он также генерирует GUID для ключа строки, чтобы гарантировать, что связи (оценки одного и того же значения) не будут конфликтовать, то есть мы не можем просто использовать счет в качестве первичного ключа. Точно так же псевдоним выбирается случайным образом. Счета делают идеальный ключ раздела, поскольку они будут распределены довольно хорошо. Как и выше, вам нужно изменить «yourservice» на собственное имя службы хранения.

TableServiceContext ctx = new TableServiceContext("https://yourservice.table.core.windows.net/", creds);
string[] aliases = {"tacowan", "dizzer", "thedude", "puzzlemaster", "wp7owner"};
int rnd = random.Next(1000);
Score score = new Score(rnd);
score.RowKey = Guid.NewGuid().ToString();
score.Alias = aliases[rnd % 5];
ctx.AddObject("scores", score);
ctx.BeginSaveChanges(asyncResult =>
{try { ctx.EndSaveChanges(asyncResult);}

 Я рекомендую скачать мой пример кода , указать свой собственный ключ и имя учетной записи, где это необходимо, и запустить пример. Сохраните счет или два, затем получите результаты. Вы увидите корректировку результатов по мере добавления новых лидеров. Надеемся, что вы придумали еще лучшие способы использования хранилища Azure. Ценность этого подхода в том, что мы не используем и не вычисляем мощность и не берем на себя никаких дополнительных затрат на запуск сервера. Кроме того, это просто, быстро и может обслуживать практически неограниченный спрос, поскольку ваше приложение становится все более популярным. Вам никогда не придется управлять сервером или добавлять новые хосты, потому что это в облачном хранилище.