architecture protocols smartphone messenger

architecture - ¿Cuál es la tecnología detrás de wechat, whatsapp y otras aplicaciones de mensajería?



protocols smartphone (4)

WhatsApp ha elegido Erlang, un lenguaje creado para escribir aplicaciones escalables diseñadas para soportar errores. Erlang usa una abstracción llamada modelo Actor para su concurrencia: http://en.wikipedia.org/wiki/Actor_(programming_language) En lugar del enfoque de memoria compartida más tradicional, los actores se comunican enviándose mensajes entre sí. Los actores a diferencia de los hilos están diseñados para ser livianos. Los actores pueden estar en la misma máquina o en diferentes máquinas y el mensaje que pasa abstracciones funciona para ambos. Una implementación simple de WhatsApp podría ser: Cada usuario / dispositivo está representado como un actor. Este actor es responsable de manejar la bandeja de entrada del usuario, cómo se serializa en el disco, los mensajes que envía el usuario y los mensajes que recibe el usuario. Supongamos que Alice y Bob son amigos en WhatsApp. Entonces hay un actor Alice y un actor Bob.

Vamos a rastrear una serie de mensajes que fluyen hacia adelante y hacia atrás:

Alice decide enviar un mensaje a Bob. El teléfono de Alice establece una conexión con el servidor de WhatsApp y se establece que esta conexión es definitivamente del teléfono de Alice. Alice ahora envía por TCP el siguiente mensaje: "Para Bob: Un monstruo gigante está atacando el Puente Golden Gate". Uno de los servidores front-end de WhatsApp deserializa este mensaje y lo envía al actor llamado Alice.

Alice, el actor, decide serializar esto y almacenarlo en un archivo llamado "Mensajes enviados por Alice", que se almacena en un sistema de archivos replicado para evitar la pérdida de datos debido a un ataque de monstruos impredecible. Alice, el actor, decide reenviar este mensaje a Bob, el actor, pasándole un mensaje "Msg1 de Alicia: un monstruo gigante está atacando el puente Golden Gate". Alice, el actor, puede volver a intentarlo con un retroceso exponencial hasta que Bob, el actor, reconozca haber recibido el mensaje.

Bob el actor finalmente recibe el mensaje de (2) y decide guardar este mensaje en un archivo llamado "Bandeja de entrada de Bob". Una vez que haya almacenado este mensaje de forma duradera, Bob el actor acusará recibo del mensaje enviando a Alice el actor un mensaje propio que diga "Recibí Msg1". Alice, el actor, ahora puede detener sus intentos de reintento. Bob, el actor, luego verifica si el teléfono de Bob tiene una conexión activa con el servidor. Lo hace y entonces Bob el actor transmite este mensaje al dispositivo a través de TCP.

Bob ve este mensaje y responde con "Para Alicia: creemos robots gigantes para luchar contra ellos". Esto ahora es recibido por Bob el actor como se describe en el Paso 1. Bob the actor luego repite los pasos 2 y 3 para asegurarse de que Alice finalmente reciba la idea de que salvará a la humanidad.

WhatsApp en realidad usa el protocolo XMPP en lugar del protocolo superior que describí anteriormente, pero entiendes el punto.

Estoy ansioso por conocer la arquitectura de diferentes aplicaciones de mensajería en tiempo real. ¿Están usando algún protocolo / arquitectura genérico?



Que yo sepa, Ejabberd ( http://www.ejabberd.im/ ) es el padre, este es el servidor XMPP que proporciona características bastante buenas de código abierto, Whatsapp usa alguna versión modificada de esto, Facebook también usa una versión modificada de esta. A algunas aplicaciones de chat les gusta ChatOn de Samsung, Nimbuzz Messenger todas utilizan las basadas en ejabberd y las soluciones de Erlang también tienen una versión modificada de este ejabberd que dicen ser altamente escalables y bien probadas con más mejoras de rendimiento y renombradas como MongooseIM.

Ejabberd es el servidor que ha implementado la mayoría de las funciones cuando se compara con otras. Dado que está construido en Erlang, es altamente escalable horizontalmente.


El Facebook de WhatsApp Architecture Comprado por $ 19 mil millones explica la arquitectura involucrada en el diseño de WhatsApp.

Aquí está la explicación general del enlace

  • El servidor de WhatsApp está casi completamente implementado en Erlang.

  • Los sistemas de servidor que hacen el enrutamiento de mensajes de fondo se hacen en Erlang.

  • El gran logro es que la cantidad de usuarios activos se gestiona con una huella de servidor realmente pequeña. El consenso del equipo es que se debe en gran parte a Erlang.

  • Es interesante notar que Facebook Chat se escribió en Erlang en 2009, pero se alejaron porque era difícil encontrar programadores calificados.

  • El servidor de WhatsApp ha comenzado desde ejabberd

  • Ejabberd es un famoso servidor Jabber de código abierto escrito en Erlang.

  • Originalmente elegido porque era abierto, tenía excelentes críticas por parte de los desarrolladores, facilidad de inicio y la promesa de la idoneidad a largo plazo de Erlang para un gran sistema de comunicación.

  • Los siguientes años pasaron reescribiendo y modificando bastantes partes de ejabberd, incluyendo el cambio de XMPP a protocolo desarrollado internamente, reestructurando la base de código y rediseñando algunos componentes centrales, y haciendo muchas modificaciones importantes a Erlang VM para optimizar el rendimiento del servidor .

  • Para manejar 50 mil millones de mensajes por día, la atención se centra en hacer un sistema confiable que funcione. La monetización es algo que se verá más adelante, está muy lejos.

  • Un indicador principal del estado del sistema es la longitud de la cola de mensajes. La longitud de la cola de mensajes de todos los procesos en un nodo se supervisa constantemente y se envía una alerta si acumulan retraso acumulado más allá de un umbral preestablecido. Si uno o más procesos se retrasan se alerta sobre eso, lo que da un puntero al siguiente cuello de botella para atacar.

  • Los mensajes multimedia se envían cargando la imagen, audio o video que se enviará a un servidor HTTP y luego enviando un enlace al contenido junto con su miniatura codificada en Base64 (si corresponde).

  • Cierto código generalmente se envía todos los días. A menudo, es varias veces al día, aunque en general se evitan los tiempos pico de tráfico. Erlang ayuda a ser agresivo para obtener soluciones y funciones en la producción. La carga en caliente significa que las actualizaciones se pueden presionar sin reinicios ni cambios de tráfico. Los errores generalmente se pueden deshacer muy rápidamente, nuevamente mediante carga en caliente. Los sistemas tienden a estar mucho más débilmente acoplados, lo que hace que sea muy fácil distribuir los cambios de forma incremental.

  • ¿Qué protocolo se usa en la aplicación Whatsapp? Socket SSL para los grupos de servidores de WhatsApp. Todos los mensajes se ponen en cola en el servidor hasta que el cliente se vuelva a conectar para recuperar los mensajes. La recuperación exitosa de un mensaje se envía de vuelta al servidor de WhatsApp que reenvía este estado al remitente original (que lo verá como un icono de "marca de verificación" al lado del mensaje). Los mensajes se borran de la memoria del servidor tan pronto como el cliente haya aceptado el mensaje

  • ¿Cómo funciona el proceso de registro internamente en Whatsapp? WhatsApp solía crear un nombre de usuario / contraseña basado en el número de IMEI del teléfono. Esto fue cambiado recientemente. WhatsApp ahora usa una solicitud general de la aplicación para enviar un PIN único de 5 dígitos. WhatsApp luego enviará un SMS al número de teléfono indicado (esto significa que el cliente de WhatsApp ya no necesita correr en el mismo teléfono). Según el número de PIN, la aplicación solicita una clave única de WhatsApp. Esta clave se utiliza como "contraseña" para todas las llamadas futuras. (esta clave "permanente" se almacena en el dispositivo). Esto también significa que registrar un nuevo dispositivo invalidará la clave en el dispositivo anterior.