Compartilhar via


Доставка пуш-уведомлений миллионам пользователей с помощью Windows Azure Notification Hubs

Пуш-уведомления критически важны для мобильных приложений подключенных к интернету. Они позволяют бэкенду сервисов отправлять частые и своевременные обновления определенным пользователям и устройствам, которые затем могут быть представлены в виде обновлений живых плиток, всплывающих тост-уведомлений, бэдж-обновлений и так далее (обратитесь к этой серии статей для того, чтобы узнать больше). Представляясь в таком виде, пуш-уведомления – это, возможно, наиболее мощный механизм вовлечения клиента доступный разработчикам приложений на телефонах, планшетах и ПК.

Существует множество инструментов, которые могут помочь вам упростить работу с пуш-уведомлениями (Windows Azure Mobile Services, например, уже включает в себя такой функционал). С помощью этих инструментов отправка отдельных уведомлений одному отдельному пользователю – это сравнительно простая задача.  Тем не менее, постоянная отправка уведомлений с низкими задержками миллионам мобильных пользователей с учетом реальных требований по локализации, поддержке разных мобильных платформ, персонализации для пользователя становится гораздо более трудной задачей.

Основная причина всех трудностей состоит в том, что пуш-уведомления отправляются на устройства с помощью специфических для платформ сервисов. Например, вам придется использовать сервис Windows Notification Service (WNS) для отправки пуш-уведомлений приложениям из Windows Store, сервис Microsoft Push Notification Service (MPNS) для Windows Phone, Apple Push Notification service (APNs) для iOS и Google Cloud Messaging (GCM) для Android.

Все эти сервисы платформ работают, используя запрошенный заранее специфический для каждого пользователя, устройства, приложения канал ChannelURI, который сохраняется где-то на бэкенде.  Затем, во время отправки уведомления, бэкенд приложения отправляет данные по каналу ChannelURI с целью достичь необходимое устройство. К этому добавляется одна сложность – актуальность каналов ChannelURI может истекать со временем (и поэтому их необходимо постоянно обновлять на бэкенде). Кроме того, у одного устройства может быть несколько одновременных активных каналов ChannelURI. Во время разработки приложений под несколько платформ сразу эти проблемы увеличиваются, так как каждая платформа обрабатывает пуш-уведомления по своему.

push-fig1

Жизненный цикл пуш-уведомлений

Представим сценарий, в котором вы желаете отправлять уведомления о горячих новостях, а каждый пользователь может подписываться на различные категории. В таком сценарии мы получим примерно следующую таблицу данных, которые будут храниться в базе данных:

Device ID Platform ChannelURI Categories Language ClientVersion
1 Windows https://channel.uri/1 {“World”, “Business”} English V1.1
2 WindowsPhone https://channel.uri/2 {“Technology”, “Sports”} French V2.0

Очевидно, что вам захочется разрешить пользователю иметь несколько устройств и если вам потребуется обрабатывать локализацию уведомлений и пользовательские предпочтения, то такой подход к данным вскоре станет проблематичным.

Кроме того, даже если учесть, что вы написали весь необходимый код для управления таблицей выше и код нужный для отправки уведомлений через каждый отдельный сервис, вы все еще можете столкнуться с проблемами, если ваше приложение (к счастью!) станет успешным. Если у вас есть тысячи устройств, которые необходимо уведомлять, то процесс простого перебора устройств в цикле для отправки уведомлений не даст вашим пользователям желаемого положительного опыта. Это означает, например, что задержки с доставкой уведомлений очень быстро станут недопустимо высокими, а вы не будете иметь возможность восстановить процесс, если что-нибудь случится посередине цикла отправки уведомлений. Очевидно, что даже если вы решите эти проблемы, сохраняя информацию об устройствах в нескольких базах данных (шардинг), создавая множество виртуальных машин, которые будут отправлять уведомления одновременно, периодически сохраняя прогресс отправки на дисковое хранилище, все равно это останется слишком сложной задачей для реализации в виде всего лишь части вашего бэкенда.

Подводя итоги: мы только что увидели как реализация практического решения с пуш-уведомлениями в вашем приложении может быстро стать большим и сложным делом. Основная трудность состоит в обработке информации об устройстве (особенно при разработке мультиплатформенных и локализованных приложений) и масштабировании инфраструктуры отправки уведомлений для миллионов устройств. Теперь давайте взглянем на то, как Windows Azure Notifications Hubs упрощают процесс для вас.

Почему Notification Hubs?

Сервис Windows Azure Notification Hubs предлагает вам экстремально масштабируемую инфраструктуру для отправки пуш-уведомлений, которая поможет вам эффективно направлять кроссплатформенные, персонализированные пуш-уведомления миллионам пользователей:

Управление идентификаторами устройств. Notification Hubs позволяют вам отказаться от необходимости хранить и управлять идентификаторами устройств или каналами URI, которые используются сервисами уведомлений каждой из платформ (WNS, MPNS, Apple PNS или Google Cloud Messaging Service). Мы, специально за вас, сами безопасно обрабатываем служебные ответы, истечение срока идентификатора устройства и так далее для каждой из PNS (Platform Notification Service).

Эффективная система мультикаста и маршрутизации на базе тегов и подписок. Устройства могут указывать один или несколько тегов во время их регистрации в Notification Hub. Эти теги показывают интерес пользователя в уведомлениях о наборе тем (любимый спорт/команда, гео-расположение, биржевой индекс, логический идентификатор пользователя и так далее). Эти теги не нужно обрабатывать повторно или заботиться об их актуальности. Они обеспечивают приложениям очень простой путь для отправки таргетированных уведомлений миллионам устройств с помощью всего лишь одного вызова API, без необходимости для вас создавать свою собственную инфраструктуру маршрутизации уведомлений для каждого устройства.

Высокая персонализация. Notification Hubs предлагают встроенный механизм шаблонов, который позволит вам задать форму, формат и локализацию уведомлений для своих клиентов, оставляя ваш собственный код бэкенда чистым и независимым от мобильной платформы.

Экстремальное масштабирование. Notification Hubs оптимизированы для отправки широковещательных рассылок пуш-уведомлений миллионам устройств с очень низкими задержками. Каждый экземпляр Notification Hub может обрабатывать до 5 миллионов устройств из коробки. А ваш собственный бэкенд должен всего лишь отправить одно сообщение в Notification Hub и уведомления автоматически распространяться миллионам ваших пользователей без необходимости переделывать ваше приложение.

Кроссплатформенность. Всего одним вызовом API Notification Hubs ваш мобильный бэкенд может отправить одновременные пуш-уведомления пользователям на устройствах Windows Store, Windows Phone 8, iOS или Android.

Использование из любого бэкенда. Notification Hubs может быть легко интегрирован в любой имеющийся серверный бэкенд. будь то .NET или Node.js, Java или PHP, Python или Ruby с помощью имеющихся SDK или открытого REST API. Сервис просто интегрируется с Windows Azure Mobile Services. Он так же может быть использован из серверных приложений размещенных в виртуальных машинах как на Windows так и на Linux, в облачных службах или веб-сайтах.

Bing News: использование Windows Azure Notification Hubs для доставки горячих новостей миллионам устройств

Одним из первых приложений, которые начали использовать Windows Azure Notification Hubs с самого старта публичной превью-версии (запущено в январе 2013 года) было приложение Bing News, которое включено в каждый ПК с Windows 8.х и доступно на устройствах с Windows Phone 8. Приложению Bing News требовалась возможность моментально уведомлять пользователей о горячих новостях. Это могло стать сложно задачей по нескольким причинам:

Экстремальное масштабирование. Каждое устройство с Windows 8.x содержит установленное приложение Bing News, что означает, что с самого момента рождения приложению требовалось отправлять сотни миллионов уведомлений о горячих новостях пользователям каждый месяц.

Рассылка на основе предпочтений. Широковещательная рассылка пуш-уведомлений на разные рынки, с учетом интересов каждого пользователя требует эффективного механизма маршрутизации, подписок и логики рассылки основанной на предпочтениях.

Кроссплатформенная доставка. Форматы уведомлений и семантика различаются на разных мобильных платформах, отслеживание каналов/идентификаторов устройств для всех платформ может быть затруднительным процессом.

Windows Azure Notification Hubs стали прекрасным решением для Bing News. Вместе с недавними обновлениями приложений, они начали использовать Notification Hubs для ежедневной доставки пуш-уведомлений миллионам пользователей на Windows и Windows Phone.

Приложение Bing News на клиенте получает соответствующие ChannelURI из Windows Notification Service (WNS) и Microsoft Push Notification Service (MPNS) для Windows и Windows Phone соответственно. Затем, приложение регистрирует эти каналы в Windows Azure Notification Hub. Когда требуется доставить уведомление о горячей новости в одном из рынков, приложение использует Notification Hubs для доставки соответствующих сообщений всем устройствам. Всего с одним вызовом API Notification Hub сервис может автоматически отфильтровать клиентов по интересам (например, сообщение о спорте) и без задержек доставить сообщение миллионам клиентов:

push-fig2

Обзор архитектуры обработки пуш-уведомлений Bing News

Windows Azure берет на себя всю логику по фильтрации и выборе пользователей и устройств и эффективно доставляет сообщения с низкими задержками.

Начинаем использовать Notification Hubs

Вы можете попробовать функции Notification Hubs в Windows Azure, создав новый Notification Hub через портал управления Windows Azure. Выберите элемент Service Bus Notification Hub в диалоге New –> App Services:

Создание нового Notification Hub займет менее минуты, после его создания вы можете открыть панель управления и начать отслеживать работу сервиса. Кроме всего прочего, вы можете наблюдать за числом устройств, которые зарегистрированы в текущий момент времени, числом сообщений которые были отправлены, числом успешно доставленных сообщений, числом ошибок при доставке:

Просто сконфигурируйте свои учетные данные полученные из Windows Store во вкладке Configure:

И это все, что нужно для запуска работы Notification Hub.

В приложении для Windows Store которое использует Windows Store device SDK, вы можете зарегистрироваться в своем Notification Hub простым вызовом:

await hub.RegisterNativeAsync(channel.Uri, new string[] { "myTag", "myOtherTag" });

Notification Hubs пока не предлагают официального SDK для WinJS, но вы можете посмотреть пример того, как использовать для таких решений открытый REST API чтобы осуществить вызов следующим кодом:

hub.registerApplicationAsync(channelUri, ["myTag", "myOtherTag"]);

Наконец, когда вам будет необходимо осуществить широковещательную рассылку сообщения для всех клиентов, просто вызовите:

var toast = @"<toast><visual><binding template=""ToastText01""><text id=""1"">Hello everybody!</text></binding></visual></toast>";
await hub.SendWindowsNativeNotificationAsync(toast);

Notification Hubs поддеррживают любой формат XML, который доступен для WNS (даже новые шаблоны для Windows 8.1). Для отправки уведомления просто создайте корректный XML-код, следуя рекомендациям Windows и используйте тот же метод, что и в предыдущем примере кода (например, вы можете добавить еще один binding для плиток размером 310х310 пикселей):

var tile = @"<tile>";
tile += @"<visual lang=""en-US"">";
tile += @"<binding template=""TileWide310x150ImageAndText01"">";
tile += @"<image id=""1"" src=""ms-appx:///images/redWide.png""/>";
tile += @"<text id=""1"">Hello World! My very own tile notification</text>";
tile += @"</binding>";
tile += @"<binding template=""TileSquare150x150Text04"">";
tile += @"<text id=""1"">Hello World! My very own tile notification</text>";
tile += @"</binding>";
tile += @"</visual>";
tile += @"</tile>";
hub.SendWindowsNativeNotificationAsync(tile);

Дополнительно, мы предлагаем готовые SDK для Windows Phone 8, Android и iOS. Кроме того, не забывайте, что вы можете использовать Notification Hubs из .NET-,бэкенда, Windows Azure Mobile Service и вообще откуда угодно с помощью Node.js SDK и открытого REST API.

После того как вы создадите свое приложение, отмасштабируйте его на миллионы пользователей прямо из портала управления Windows Azure:

И получайте диагностические данные о своих уведомлениях с десятков метрик:

Заключение

С помощью Notification Hubs вы можете добавить функцию пуш-уведомлений в свое приложение без написания кода для управления устройствами или обеспечения кроссплатформенности. Быстро настройте группы интересов и рассылайте уведомления миллионам устройств без дополнительной работы. Начините изучать Notification Hubs прямо сейчас на странице Notification Hubs service page или переходите сразу к руководствам Getting Started with Notification Hubs или обучающему видео. Если у вас до сих пор нет учетной записи Windows Azure, вы можете подписаться на бесплатный триал и начать использовать сервис уже сегодня.

Это перевод оригинальной статьи
Delivering push notifications to millions of devices with Windows Azure Notification Hubs