API каналов Google App Engine и отправка сигналов пульса от клиента - PullRequest
2 голосов
/ 24 марта 2011

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

Способ, которым мы делаем это сейчас, заключается в том, что у нас есть настройка функции для запуска в JS с интервалом, который отправляет сигнал сердцебиения в приложение GAE с помощью вызова AJAX. Это работает относительно хорошо, но генерирует много трафика и использование процессора. Если мы не слышим сердцебиение от клиента в течение нескольких минут, мы определяем, что он оставил заявку. У нас также есть функция unload, предназначенная для отправки сообщения детали, снова через вызов AJAX. Это работает меньше, чем хорошо, но в большинстве случаев совсем нет.

Мы также используем API каналов. Одна вещь, которую я заметил, это то, что наше приложение при использовании открытого канала, клиент, похоже, также посылает сигнал сердцебиения в виде вызова на http://talkgadget.google.com/talkgadget/dch/bind. Я полагаю, что это происходит с iFrame и / или JS загружается при открытии канала в клиенте.

У меня вопрос: может ли мое приложение на стороне сервера каким-либо образом подключиться к этим вызовам на http://talkgadget.google.com/talkgadget/dch/bind и использовать это как сигнал сердцебиения? Есть ли лучший способ определить, подключен ли клиент, даже если он ничего не делает в нем?

Ответы [ 4 ]

3 голосов
/ 11 апреля 2013

Google добавил эту функцию:

См. https://developers.google.com/appengine/docs/java/channel/overview

Отслеживание клиентских подключений и отключений

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

Вы можете включить эту входящую службу в appengine-web.xml:

1 голос
/ 24 марта 2011

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

Если вы просто хотите узнать, что они не в сети, вы можете прекратить отправку сообщений, иначе это не важно для вас.Знайте сразу, вы можете просто прокручивать пинг на регулярные взаимодействия.Всякий раз, когда вы отправляете клиенту обновление, и вы ничего не слышали от него в течение некоторого времени, пометьте сообщение «запросом ping» и попросите клиента отправить HTTP-пинг всякий раз, когда он получает такое помеченное сообщение.Таким образом, вы узнаете, что они исчезли вскоре после того, как отправите им сообщение.Вы также не налагаете много дополнительных накладных расходов, поскольку им нужно только отправлять явные пинги, если вы ничего от них не слышите.

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

1 голос
/ 24 марта 2011

У меня нет хорошего решения вашей основной проблемы "подключения" клиента к серверу. Но у меня есть интересная мысль о вашей текущей проблеме «трафика и использования процессора» для периодических пингов.

Я предполагаю, что у вас есть заранее установленный интервал сердцебиения, скажем, 1 мин. Таким образом, если имеется 120 клиентов, ваш сервер будет обрабатывать удары сердца со средней скоростью 2 в секунду. Не хорошо, если половина из них - «бездействующие клиенты».

Предположим, что клиент бездействует уже 15 минут. Этот клиентский браузер все еще должен посылать сердечные сокращения с постоянным заданным интервалом в 1 минуту? Почему бы не сделать его переменным?

Мое предложение простое: меняйте частоту сердцебиения в зависимости от уровня активности клиента.

Когда клиент «активен», сердцебиение работает с частотой 1 в минуту. Когда клиент «неактивен» более 5 минут, частота сердечных сокращений снижается до 50% (по одному каждые 2 минуты). Еще 10 минут, и частота сердечных сокращений снижается еще на 50% (1 через каждые 4 минуты) ... В какой-то пороговый момент считайте клиента «отцепленным».

В этом методе «незанятые клиенты» не будут беспокоить сервер частыми пульсами, что позволит вашему серверу приложений сосредоточиться на «активных клиентах».

Очень много javascript, но, вероятно, того стоит, если у вас проблемы с трафиком и использованием процессора: -)

1 голос
/ 24 марта 2011

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

https://groups.google.com/d/msg/google-appengine/sfPTgfbLR0M/yctHe4uU824J

Я бы попробовал прикрепить параметр «пожалуйста, подтвердите» к каждому N-му сообщению (в шахматном порядке, чтобы каждый клиент не мог подтвердить одно сообщение). Если 2 из них игнорируются, отключите звук канала, пока вы не услышите от этого клиента.

...