AppEngine Channel API - лучший способ проверить, открыт ли канал (на стороне сервера) - PullRequest
7 голосов
/ 26 января 2011

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

Это было бы чрезвычайно полезно, если быбыл способ проверить (на стороне сервера), есть ли у конкретного клиента открытый канал.Например, если я назначу клиенту «Джек» идентификатор канала «Джек-янв-21-2010», то я хотел бы иметь возможность проверить на стороне сервера, есть ли уже открытый канал, связанный с идентификатором »Джек-Jan-21-2010" .Это можно (вроде) отслеживать на стороне клиента, наблюдая за обратным вызовом onerror () и onclose (), но я не вижу ничего на стороне сервера, которое позволяет мне просто проверить, является ли канал, связанный с данным идентификаторомуже открыт.

Кто-нибудь знает умный способ проверить (на стороне сервера), был ли канал уже открыт при использовании AppEngine Channel API?

1 Ответ

18 голосов
/ 26 января 2011

Часть 1: Решение вашей проблемы

См. Часть 2 ниже, если вам действительно нужно отслеживать клиентские подключения, но я не уверен по вашему вопросу, решит ли то, что вы запрашиваете, вашу проблему.

Дайте мне посмотреть, смогу ли я повторить вашу проблему в ответ: вы пишете приложение для чата, но оно предназначено для сайта, который не полностью поддерживает AJAX (как, скажем, gmail); Сайт содержит навигацию по страницам, где вам может понадобиться перенастроить канал после того, как пользователь нажмет на ссылку на другую страницу. Когда пользователь перемещается, отображается новая страница, и вы хотите избежать получения нового токена на этом этапе; Вы хотите повторно использовать существующий токен и канал с тем же идентификатором клиента.

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

  • Сохранить токен в файле cookie. Когда вы повторно визуализируете свою страницу, просто используйте токен из cookie вместо повторного вызова channel.create_channel. По истечении срока действия токена вы получите обратный вызов onerror, как если бы пользователь остался на исходной странице; в этот момент снова вызовите channel.create_channel. Проблема заключается в том, что повторное соединение может быть медленным (до 10 секунд или более в плохих случаях) из-за характера соединений Comet.

  • Оберните весь свой сайт, не связанный с чатом, в iframe. Поместите код создания канала и пользовательский интерфейс во внешний фрейм. Таким образом, вам не нужно повторно подключаться каждый раз, когда пользователь перемещается. Это позволяет избежать простоев при навигации. Обратите внимание, что orkut использует эту технику с плавающими divами, что покажет небольшое количество исследований Firebug.

Часть 2. Ваш запрос на добавление

Если выясняется, что я неправильно понимаю, и вам действительно нужно отслеживать клиентские соединения:

Нет встроенного способа проверить, подключен ли клиент к каналу, идентифицированному идентификатором клиента.

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

Обратите внимание, что это будет не на основе токена, а на основе идентификатора клиента.

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

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

...