Как добиться надежного обслуживания push-сообщений? - программирование
Подтвердить что ты не робот

Как добиться надежного обслуживания push-сообщений?

Поскольку я хочу создать надежную связь в мобильных приложениях, могу ли я получить push-отчеты (возможно, устройство отключено) от сторонних служб push (C2DM, APN, городской дирижабль)? Или нам нужно построить его самостоятельно?

4b9b3361

Ответ 1

Предполагаемая цель Android C2DM - это способ экономии заряда аккумулятора для вашего серверного приложения, чтобы сигнализировать мобильному устройству, что он хочет начать надежную связь.

Вы можете структурировать свое сообщение, чтобы каждый новый C2DM охватывал все, что произошло с момента последнего двухстороннего взаимодействия с сервером (т.е. "приходят и получают все, что у меня есть" ). Ваш неудачный отчет о доставке неявно отображается в мобильном устройстве, не отвечающем быстро (вы можете это сделать, потому что знаете, что C2DM активирует ваше приложение с помощью Intent).

Неужели это действительно хуже, чем гарантированная доставка каждого сообщения в среде с потерями? Хорошо, это хуже, потому что вам также нужно внедрить основной метод связи. Но вы все равно должны были это сделать, потому что C2DM только входящий, правильно?

Ответ 2

Как говорит Винай, MQTT может предложить вам эту функцию. Когда клиент подключается к серверу, он может зарегистрировать сообщение "последнее желание и завещание" с сервером. Если клиент неожиданно отключается, сервер отправляет это сообщение в тему, которую ему было дано указание.

В этой схеме ваш клиент может отправить сообщение "онлайн" на что-то вроде состояния клиента//и зарегистрировать сообщение "offline" как LWT для той же темы. Тогда у вас может быть локальный клиент сервера, который прослушивает тему client/+/status, и он будет знать, какие клиенты были в сети, а какие - в автономном режиме.

Я бы предположил, что демо tokudu - не лучшее место для просмотра. Это сообщение в блоге от Dale Lane дает представление об использовании MQTT на Android: http://dalelane.co.uk/blog/?p=1599, и есть обзор использования мощности MQTT (снова на Android) на http://stephendnicholas.com/archives/219

Существуют клиентские реализации для IOS и Android, см. http://mqtt.org/software

Ответ 3

Ни одна служба не предоставляет отчеты о неудачных нажатиях.

Неудачный push-отчет мало влияет на APN/C2DM/Helium

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

Кроме того, для iOS push-message - это просто уведомление для пользователя, а не для приложения!

Простой пример иллюстрирует это: Предположим, что нажатие нажата, когда приложение выключено. В этом случае произойдет уведомление пользователя. Но приложение будет получать данные от push, только если пользователь нажимает на это уведомление! Если пользователь коснется значка приложения, данные не будут получены.

Так технически, push доставляется на устройство iOS, и приложение запускается, но данные не доставляются.

UrbanAirhip с APN и гелием

Вы можете рассмотреть возможность реализовать свой собственный транспорт для подталкивания. MQTT кажется хорошим вариантом. Но в этом случае вам приходится иметь дело с keepalives, спящими устройствами и оптимизацией батарей. Все эти тяжелые работы уже сделаны инженерами из Apple, Google и UrbanAirship.

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

Присмотритесь к UrbanAirship. Фактически, C2DM имеет некоторые ограничения, и иногда тайминг для доставки push-сообщения слишком велик. Из-за этого UA реализовал свой собственный транспорт - гелий, он работает очень хорошо. Гелий - платная услуга, но UA обеспечивает хорошее SLA.

Ответ 5

Я сделал что-то подобное, когда у меня была база данных, отслеживающая очереди с известными подписчиками, и сообщалось о неудачных попытках. Это было очень просто и пошло что-то вроде этого...

The schema was like so:

pushMessages
  messageID  , GUID, PK
  message , nvarchar (256),
  expires , datetime

messageQueues
  subscriberID , GUID, PK
  messageID , GUID PK

failedPushMessages
  subscriberID, GUID, PK
  messageID , GUID PK

(subscriber table omitted)

Как только клиент получил сообщение успешно, клиент будет откликнуться на push-сервер и уведомить об этом через уникальный идентификатор queueItems, который он получил в push-уведомлении. Также будет ежедневный процесс базы данных, который будет проверять истекшие push-сообщения. Когда он будет найден, он будет выполнять соединение в очередиMessages, соответствующее идентификатору messageID, затем удалит их из таблицы messagesQueues и скопирует их в таблицу failedPushMessages.

Это было очень легко понять и поддерживать, но у меня нет опыта, делающего это по-другому.

Ответ 6

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