hangouts android xmpp chat

android - hangouts - ¿Está bien usar HTTP REST API para la aplicación de chat?



hangouts api send message (5)

Creo que un enfoque REST puede funcionar para chatear. Asumamos:

Si entiendo correctamente, su pregunta es sobre el último punto.

Una vez que el cliente haya publicado un mensaje de inicio en http://chat.example.com/conversations/123 , cerrará la conexión http.

El inconveniente es que la recepción de mensajes entrantes simplemente no es posible en ese caso. Necesitará un canal diferente (tal vez simplemente mensajes en la nube de Google ).

Por el contrario, WebSockets y XMPP mantienen viva la conexión, por lo que pueden recibir mensajes sin demora. Pero el inconveniente de ambos es que esto representa un costo para el servidor, en términos de escalabilidad; y un costo para el cliente en términos de uso de la batería.

En el servidor:

  • sockets son un recurso relativamente escaso
  • no es posible mover clientes para equilibrar la carga si tienen una conexión abierta (pero ¿puede realmente mover clientes? esto depende de la responsabilidad de los niveles)

En el cliente:

Estamos construyendo una aplicación de chat en Android. Estamos pensando en utilizar la API REST de HTTP para enviar mensajes salientes. ¿Quería saber si es un buen enfoque o tiene alguna desventaja en comparación con el uso de WebSockets o XMPP (que parece ser un estándar de facto para transferir mensajes de chat)?

Algunos de los pros / contras que puedo pensar son:
+ El punto final HTTP es fácil de escalar horizontalmente en el lado del servidor (esta es una de las principales preocupaciones)
+ La curva de aprendizaje para Websockets es más pronunciada en comparación con HTTP
- Los mensajes HTTP tendrían una mayor carga útil en comparación con los websockets

Según este documento, parece que incluso Facebook usó AJAX para manejar los mensajes de chat inicialmente:

https://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf


Depende. ¿Considera que su aplicación es "chat en vivo"? ¿Necesita un indicador de presencia o un indicador de escritura? Características como las que requieren conexión continua. Pero hay otro conjunto de aplicaciones de chat que describirías como "mensajería dentro de la aplicación" habilitado. Estas aplicaciones almacenan conversaciones y listas de conversaciones en algún tipo de backend; simplemente instale la aplicación en otro dispositivo e inicie sesión, y verá sus conversaciones sobre este tipo de aplicación. Estas aplicaciones no tienen ningún indicador de presencia, o sensación de vida.

Aunque no he implementado ninguna aplicación con XMPP, parece que en cuanto a la persistencia de mensajes, la mayor persistencia que encontrará con XMPP (fuera de la caja) es persistente hasta que se entrega, similar a SMS. Quizás pueda crear un mecanismo de almacenamiento / recuperación para XMPP capturando stanzas a medida que pasan y almacenándolas en su propia base de datos. Pero si no necesita la experiencia completa de "chat", usar una base de datos, el servicio HTTP y las notificaciones automáticas (para notificar los subprocesos actualizados) parece ser una ruta sólida para las aplicaciones con funcionalidad de mensajería, que tengo la intención de implementar en un iOS y Aplicación de Android de mi propio momento.

Avíseme si ha encontrado un buen diseño de API / esquemas de código abierto para esto.


No se sugiere utilizar la API de Resto HTTP para chatear o aplicaciones similares en tiempo real.

Algunos resumen ...

Requisitos del cliente de chat

  1. Lista de amigos buscar

  2. Compruebe en línea / fuera de línea amigos

  3. Recibe mensajes de chat en tiempo real y envía mensajes.
  4. Recibir notificaciones de entrega / lectura etc.

El punto 1 es una especie de trabajo de una sola vez después de iniciar el cliente de chat, por lo que se puede hacer con una simple llamada de descanso, por lo que no hay gastos generales complicados.

Descansar todos los puntos necesitarán una verificación persistente de los datos del servidor u otra parte en el caso del cliente p2p también. Lo que hará que cree llamadas de descanso de sondeo largo o corto para observar nuevos datos u otras actualizaciones.

Problema con el cliente HTTP Rest

No es una comunicación de tipo mantener vivo, debido a la cual tendrá que hacer múltiples conexiones http, que tendrán tantos gastos generales que se volverán demasiado rezagados. Como reconectarse es muy costoso en llamadas HTTP.

** Sockets web o XMPP ** Son un modo de comunicación dúplex y son muy buenos para manejar los envíos de datos incrementales y no está creando nuevas conexiones http de nuevo, por lo que ofrece un rendimiento realmente suave.

Otra solución En caso de que se quede atascado con algunos sistemas heredados en caso de que esté obligado a utilizar el modo api de descanso.

Pruebe CometD: es un enfoque híbrido de websockets y ajax polling que le brindará comunicaciones casi en tiempo real, además de trabajar con clientes que no admiten websockets al recurrir a los mecanismos de ajax polling. También utiliza varias optimizaciones para evitar volver a conectarse una y otra vez.

CometD link

También puede probar Socket.io, que también es una tecnología increíble para resolver este tipo de casos de uso


Podemos usar la API REST para mensajes de chat, pero en mi humilde opinión, XMPP es una mejor alternativa. Consideremos lo que XMPP tiene para ofrecer.

XMPP además de soportar el transporte TCP también proporciona HTTP (a través de sondeo y enlace ) y transportes websocket . Leer XMPP a través de HTTP y WebSocket.

Sería interesante comprender los pros y los contras de cada transporte desde la perspectiva de XMPP.

XMPP podría usar HTTP de dos maneras: sondeo [18] y enlace .

XMPP sobre HTTP Polling

El método de sondeo, ahora en desuso, esencialmente implica que los mensajes almacenados en una base de datos del lado del servidor son captados (y publicados) regularmente por un cliente XMPP a través de las solicitudes HTTP ''GET'' y ''POST''.

XMPP sobre enlace HTTP (BOSH)

El método de enlace se considera más eficiente que las solicitudes HTTP ''GET'' y ''POST'' en el método de sondeo porque reduce la latencia y el consumo de ancho de banda en comparación con otras técnicas de sondeo HTTP.

Sin embargo, esto también presenta una desventaja de que los enchufes permanecen abiertos durante un período prolongado de tiempo, a la espera de la próxima solicitud del cliente.

El método de enlace, implementado mediante secuencias bidireccionales a través de HTTP sincrónico ( BOSH ), [19] permite a los servidores enviar mensajes a los clientes tan pronto como se envían. Este modelo de notificación push es más eficiente que el sondeo, donde muchos de los sondeos no devuelven datos nuevos.

Sería bueno si entendiéramos cómo funciona la técnica BOSH .

La técnica empleada por BOSH, que a veces se denomina "sondeo largo HTTP", reduce la latencia y el consumo de ancho de banda en comparación con otras técnicas de sondeo HTTP. Cuando el cliente envía una solicitud, el administrador de conexión no envía inmediatamente una respuesta; en su lugar, mantiene abierta la solicitud hasta que tenga datos para enviar al cliente (o haya transcurrido una duración de inactividad acordada). El cliente envía inmediatamente una nueva solicitud al administrador de conexión, continuando el largo ciclo de sondeo.

Si el administrador de conexión no tiene datos para enviar al cliente después de un período de tiempo acordado [12], envía una respuesta con un vacío. Esto tiene un propósito similar a los espacios en blanco para mantener en vivo o XMPP Ping (XEP-0199) [13]; ayuda a mantener activa una conexión de socket, lo que evita que algunos intermediarios (firewalls, proxies, etc.) lo dejen caer silenciosamente, y ayuda a detectar interrupciones en un tiempo razonable.

XMPP sobre enlace WebSocket

XMPP admite el enlace WebSocket, que es un transporte más eficiente

Un transporte quizás más eficiente para la mensajería en tiempo real es WebSocket, una tecnología web que proporciona canales de comunicaciones bidireccionales y dúplex completos a través de una única conexión TCP. El enlace XMPP sobre WebSocket se define en el estándar propuesto por el IETF RFC 7395.

Hablando de la curva de aprendizaje, sí, podría sentirse tentado a utilizar la API REST, pero ahora hay varios recursos para aprender sobre Android y XMPP , y los softwares de servidor XMPP que puede usar para ejecutar su propio servicio XMPP, ya sea a través de Internet. o en una red de área local. Valdría la pena gastar este esfuerzo antes de decidir su arquitectura.


Respuesta corta No.

No iniciaría un nuevo proyecto ni recomendaría comenzar un nuevo proyecto (ya que mencionó comenzar de nuevo) que necesita una comunicación bidireccional en vivo que se basa en HTTP, como protocolo sin estado. Puede sentirse cómodo de que la conexión se mantiene viva, pero no hay garantía.

Su + HTTP endpoint is easy to scale horizontally on server side pro es un profesional en el contexto cuando HTTP se usa como estilo de solicitud y respuesta y cuando se considera sin estado. Se vuelve un tanto discutible (aunque no del todo) cuando necesita inherentemente mantener viva la conexión.

HTTP ofrece otro beneficio siguiente que no ha mencionado aquí.

  • HTTP es fácil de manejar con servidores proxy de firewall cuando otros puertos pueden estar bloqueados.

Aquí es donde WebSockets o XMPP sobre HTTP tendrán una mejor tasa de éxito como lo mencionaron otros.