Время доставки GCM-сообщений WILDLY беспорядочно - программирование
Подтвердить что ты не робот

Время доставки GCM-сообщений WILDLY беспорядочно

Я установил Android-приложение с поддержкой GCM и попробовал небольшое тестовое приложение для отправки сообщения в приложение. Когда я запускаю приложение в эмуляторе, я вижу (через протоколирующие сообщения), что он регистрируется с помощью GCM и получает токен.

Затем, когда я помещаю токен в свое тестовое приложение и отправляю сообщение с сообщением, результат показывает, что отправлено 1 msg, 0 не удалось, а 0 - смены идентификатора.

Иногда msg появляется почти сразу, иногда это занимает 20 минут. В пятницу мои 2 тестовые сообщения заняли 15 и 20 минут. Первые 2, которые я отправил сегодня утром, были немедленно, следующий еще не появился - это было всего 10 минут...

Есть ли что-нибудь, что я могу сделать, чтобы время доставки было быстрым? Случайная 20-минутная задержка будет в значительной степени неприемлемым условием.

4b9b3361

Ответ 1

У нас была та же проблема, но она варьировалась от сети к сети. Мы считаем, что маршрутизатор домашнего хаба (Virgin Super Hub) отключил связь после пяти минут бездействия. Вы можете подтвердить, отправив пустое сообщение GCM каждые две минуты, чтобы сохранить соединение в сети.

Вот более подробное объяснение того, что мы сделали: https://groups.google.com/d/msg/android-gcm/Y33c9ib54jY/YxnCkaPRHRQJ

Ответ 2

Вы не можете гарантировать быструю доставку, потому что соединение GCM с устройством может быть неудовлетворительным, как указывает CommonsWare. Однако есть две возможные задержки в доставке: 1) GCM, подключаемый к телефону (как упоминалось ранее) и 2) Задержка в сообщении, фактически отправляемом с сервера GCM. Если вы установите для параметра "time_to_live" значение 0 секунд в отправляющем приложении, вы можете, по крайней мере, проверить, где происходит задержка.

Значение 0 секунд означает, что сообщение будет отправлено немедленно, и если доставка не удалась, сообщение будет отброшено на сервере GCM. Это не практическое значение для использования в реальной жизни, но позволит вам узнать, какая часть маршрута доставки вызывает задержку.

Ответ 3

Сообщается, что GCM имеет довольно серьезную проблему, когда сердечный ритм keep-alive не является настолько надежным. Поэтому, поскольку он отправляется только каждые 15 минут (через 3G) или 28 минут (по Wi-Fi), если по какой-либо причине соединение с сервером отключено, оно может не восстанавливаться в течение нескольких длинных минут.

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

https://help.pubnub.com/entries/21720011-Can-my-Android-App-Receive-Messages-While-Inactive

Ответ 4

Это действительно вызвано <сильными > нереалистичными интервалами сердцебиения в облачных сообщениях Google.

Это, возможно, самая неприятная ошибка в GCM. GCM работает, поддерживая соединение в режиме ожидания с устройства Android на серверах Googles. Это здорово, потому что он едва потребляет энергию батареи (вопреки опросу), и это позволяет мгновенно разбудить устройство при поступлении сообщения. Чтобы убедиться, что соединение остается активным, Android отправит мгновенное сообщение каждые 28 минут на мобильном телефоне и каждые 15 минут на WiFi. Если не удалось сердцебиение, соединение было прекращено, и GCM восстановит его и попытается получить любые ожидающие push-уведомления. Чем выше интервал сердцебиения, тем меньше потребляется батарея и меньше времени, которое устройство должно пробуждаться от сна.

Однако, это идет по отличной цене: чем дольше интервал между битами, тем дольше требуется определить сломанное соединение сокета. Google не тестировал эти интервалы в реальных ситуациях достаточно тщательно, прежде чем развертывать GCM. Проблема с этими интервалами вызвана сетевыми маршрутизаторами и мобильными операторами, которые отключили простоя разъемов через несколько минут бездействия. Обычно это чаще встречается у дешевых домашних маршрутизаторов, чьи производители решили максимально продолжительное время простоя подключения к сокету и прекратить его для экономии ресурсов. Эти маршрутизаторы могут обрабатывать только конечное число одновременных подключений, поэтому эта мера берется для предотвращения перегрузки. Это приводит к отключению сокетов GCM, и когда придет время доставлять сообщение GCM, оно не доходит до устройства. Устройство только осознает, что соединение было сломано, когда его время было отправлено сердцебиение, 0 - 28 минут спустя, что в некоторых ситуациях бесполезное сообщение push бесполезно (например, когда сообщение является критическим по времени). По моему опыту, самые дешевые маршрутизаторы заканчивают бездействующие соединения примерно через 5-10 минут бездействия.

Я написал целую запись об этом и других проблемах GCM:

http://eladnava.com/google-cloud-messaging-extremely-unreliable/

Альтернатива облачным сообщениям Google

Pushy (https://pushy.me/) является автономным шлюзом push-уведомлений, полностью независимым от GCM. Он поддерживает собственное фоновое сокетное соединение, как и GCM, для получения push-уведомлений. Основным протоколом является MQTT, чрезвычайно легкий протокол pub/sub, использующий очень небольшую пропускную способность сети и батарею.

Огромное преимущество Pushy заключается в том, что код для отправки push-уведомления (с сервера) и регистрации устройства для push-уведомлений фактически взаимозаменяем между GCM и Pushy. Это делает его очень простым переключиться на Pushy после внедрения GCM и вынудить его отключить для своей нестабильности.

(Полное раскрытие: я основал Pushy для своих собственных проектов и понял, что многие приложения выиграют от такой услуги)

Ответ 5

Этот вопрос важен для меня.

Я установил этот код внутри одного таймера Handler для отправки сообщения GCM каждые 2 минуты. Надеюсь, что он сохранит жизнь.

            if ((mOneSecondTick %120) == 0){
            // q 1 minute check when we got last call....
            long lDiff = System.currentTimeMillis() - GCMlastCall;
            if (PushAndroidActivity.GCMAvailable){
                Log.d("pushAndroidActivity",String.format("(mOneSecondTick %d",lDiff));
                if (lDiff > 122 * 1000){ // more than a minute
                    Intent intent = new Intent(StayInTouch.this,PushAndroidActivity.class);
                    2startActivity(intent);
                }else{ // every 2 minutes send out a gcm message...
                    asyncWebCall(String.format(AgeingLib.GCMTICKLE,androidid),0);
                    return; // only if it sends a tickle and all is well...
                }
            }else{
                Log.d("pushAndroidActivity",String.format("(mOneSecondTick mod60 no GCM on this device"));
            }
        }

GCMlastCall - это последний раз, когда было получено сообщение, поэтому мы можем сказать, что gcm остановлен.

Работает на пару дней, кажется, ОК

Ответ 6

Есть ли что-нибудь, что я могу сделать, чтобы время доставки было быстро?

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