Объединение нескольких сообщений GCM в AppEngine

У меня есть приложение для Android, которое использует Google Cloud Endpoints для синхронизации данных между устройствами. В настоящее время при каждом вызове API сообщение GCM отправляется на все остальные устройства. Часто устройства выполняют не только один вызов API, но и несколько непосредственно друг за другом. В этой ситуации становится крайне неэффективно отправлять сообщение при каждом вызове, потому что тогда все остальные устройства будут делать несколько вызовов для получения новых данных, а не только один для всех.

Итак, моя идея в основном состоит в том, чтобы после вызова API подождать ~ 10 секунд, а затем отправить сообщение GCM. Всякий раз, когда поступает новый вызов, и таймер сбрасывается.

Моя проблема в том, что я действительно не знаю, как это сделать в AppEngine. Моей первой идеей была TaskQueue с задачей, названной определенным образом и имеющей 10-секундную задержку. В вызове API я проверяю, находится ли задача в очереди, и если да, я удаляю ее и вставляю новую. Это было невозможно, потому что имя задачи нельзя использовать снова, даже если задача больше не существует.


person Gabriel Ittner    schedule 07.03.2013    source источник


Ответы (2)


Если ваше Android-приложение знает разницу между вызовами своей конечной точки: знает, какой из них является «последним» вызовом, то оно может сообщить серверу, следует ли уведомлять другие устройства.

Даже если это не так, вы можете сделать на клиенте что-то похожее на то, о чем вы говорите на сервере: продолжать откладывать до тех пор, пока не будет уверен, что последний вызов был сделан (например, пользователь закончил обновление данных) и затем выполните «последний» вызов сервера, который вызывает отправку уведомлений. Это можно сделать в службе, если вы беспокоитесь, что приложение будет убито до того, как будет сделан последний вызов.

Или вы можете сделать то же самое в принимающем коде клиента: когда он получает уведомление GCM, он может отложить его, прежде чем реагировать на него.

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

person Tom    schedule 07.03.2013
comment
Спасибо, я позволю клиенту сообщить серверу, какой вызов является последним. - person Gabriel Ittner; 07.03.2013

Не было бы намного проще, если бы устройство явно указывало, когда отправлять сообщение GCM?

person dragonx    schedule 07.03.2013