Стоит ли использовать Microsoft Azure для простого игрового web-сервиса?
Я работаю над простой turn-based игрой для Windows Phone/Windows Store (universal app), и хочу добавить возможность сетевой игры. Скажу сразу, что с web приложениями и cloud сервисами у меня большой пробел в знаниях - я практически никогда с подобными приложениями не работал, несмотря на весьма долгий профессиональный опыт разработчика.
Когда-то, впрочем, я экспериментировал с Windows Phone 7 приложением и ASP .NET Web сервисом (был такой в VS 2010), все получилось (захостил сервис тогда на каком-то бесплатном ASP хостинге), и даже работало (правда, пришлось повозиться с периодическим падением клиента по unhandled exceptions в авто-генерированном коде).
На страничке моего эккаунта BizSpark-а давно висело предложение бесплатного Microsoft Azure; я сделал небольшое гугл-исследование и выяснил, что Microsoft считает Azure самым эффективным средством для mobile services. Ну, попробовать-то недолго... Зарегистрировался, создал Mobile service, скачал их sample. Что любопытно, он даже заработал (без вылетов по необработанным исключениям, естественно, не обошлось :) ).
Но когда я посмотрел в консоль Azure, то был немного (точнее, изрядно) удивлен: простейшая операция вывода 3 строк ("заметок") совершила порядка 10 API calls (из 16667/day бесплатных), при этом ушло около 350 Kb трафика (замечу сразу - с кодом sample не разбирался, fiddler-ом пока не смотрел).
Честно говоря, мне все это очень не понравилось: помимо моих возможных расходов (а неизвестно еще, окупится приложение или нет), неплохо-бы и поэкономить мобильный трафик будущих пользователей... Да и на производительность это "толстые" запросы влияют не лучшим образом, плюс "первый call всегда комом" - не знаю, отчего, но на Windows Phone первый раз идет timeout, и лишь после перезапуска приложение начинает работать. Напомню, что речь идет не о моем коде, а о примере, который выдает Microsoft Azure при создании Mobile service.
Мои требования к нужному мне сервису чрезвычайно низкие:
- он должен писаться на .NET/C# (нужно использовать shared код из клиентов, написанных на C#)
- в функциональность должно входить:
- регистрация пользователя ("вход в комнату")
- отправка сообщений пользователям (текстовых - чат, и приглашения сыграть)
- отправка ходов между пользователями, начавшими игру (нужно пересылать всего один байт)
- обработка ошибок связи и информирование клиентов (т.е. "отпал" один из играющих, и второго нужно уведомить) - т.е. простой суб-сервис типа ping
- база данных мне, как таковая, не нужна; ну, разве что хранить результаты игр, но это (пока) опционально.
Хочу спросить у знатоков: что вы мне можете посоветовать? Клиентов я предвижу немного (я - реалист); максимум (в самом лучшем случае!) порядка 50. Буду также очень благодарен за исходные тексты подобного простенького сервиса.
@sensboston
Вы сделали не совсем корректные выводы насчет сервиса на основании единичного примера.
Попробую объяснить с помощью аналогии -
Вот смотрите у вас задача сходить в магазин за продуктами, до магазина 500метров.
У вас выбор - либо идти пешком, либо ехать на машине.
Вы пробуете доехать на машине - выходите из дома, идете до стоянки 150метров, прогреваете машину, обнаруживаете что бензина мало, едете на заправку, после чего в магазин.
В итоге вы потратили 40минут чтобы доехать до магазина. А пешком до этого магазина идти 10-15минут.
И на основании этого вы делаете вывод, что на машине проехать 500метров по времени занимает примерно 40минут. Т.е передвигаться на машине в три раза медленнее чем пешком.
Так же и с вашей простейшей операцией на вывод трех строк - запуск сервиса сам по себе требует ресурсов, даже если там одна строка, или вообще нет строк.
@Jump, а overhead в сотни килобайт при выполнении элементарной был Вами не замечен? Ваша аналогия неправильна, и не полна.
Правильная "автомобильная" аналогия, похоже, такова: мне нужно сходить в магазин за буханкой хлеба. У меня есть варианты (или - нет особых вариантов):
- сходить пешком
- съездить на велосипеде
- съездить на легковом автомобиле
- съездить на большегрузном самосвале <- вот этот вариант, похоже, и есть Azure's mobile service.
В принципе, могу потратить еще время и немного "поиграться", реализовать необходимую мне функциональность (благо, она невелика) через Azure, но что-то мне подсказывает, что затраты на одну игру (скажем, 30 ходов) будут весьма чрезмерны - сотни API calls и мегабайты overhead-а (который опять-таки мобильный трафик клиентов).
У Вас есть какой-то практический совет или рекомендация? Что-нибудь "полегче", REST-based, может быть?
@newross, спасибо за предложение. Немного смущает third party ServiceStack, плюс то, что у них, вроде, нет клиентов для WP/Store (не уверен, лишь взглянул). Но вообще-то хочется чего-то более "стандартного".
Еще интересно, а с виртуальной машиной я не "попаду на деньги" (это не так принципиально, но, учитывая, что требуемый мне сервис аналогичен веб-сайту с посещаемостью порядка нескольких сотен клиентов в сутки, платить за такое даже $10/month как-то "некомильфо").
Я уже стал подумывать том, чтобы просто поднять IIS + ASP сервис на домашнем сервере (поскольку он и так up 24 часа в сутки).
Как я понимаю, бизнес-цели Microsoft Azure и мои диаметрально противоположны: они хотят на мне заработать хоть как-то, а я хочу бесплатно...
@sensboston ну тогда вариант IIS + WebApi на домашнем сервере - самое оно.
По поводу клиента ServiceStack на WP - стандартный клиент с минимальными доработками прекрасно работает.
Меня больше привлекла не способность держать высокие нагрузки, а почти "реалтаймовость" их фреймворка (демо игра впечатляет, но... падает периодически :( ) И "сложности" - не проблема, если бы оно работало "из коробки" - ан нет, под Windows Phone 8 не собирается :( Повожусь еще немного; если "каменный цветок" не выйдет, забъю и попробую штатные средства (впрочем, и там косяков более чем хватает).
@newross, "ткнуть пальцем" в простой ASP .NET сервис с примерно подобют функциональностью, и клиентами на WP8/store не можете? Так, чтобы сразу запускался, без шаманства и плясок с бубном?