HOME / BLOG / Digital Lab

Arquitectura de un servicio de mensajería instantánea como WhatsApp

WhatsApp es una de las aplicaciones de mensajería multiplataforma que más se utiliza. El envío de información es inmediato, de ahí que cada vez más sitios web lo incluyan como un servicio más para facilitar la comunicación con los usuarios.

En el siguiente post vamos a ver cómo es su arquitectura y cómo funciona a nivel técnico un servicio de mensajería instantánea como WhatsApp.

Los dos tipos de chats más conocidos son Facebook Messenger, que se encarga de guardar todos los mensajes indefinidamente, y el otro es WhatsApp, que los almacena hasta que se entregan. Una vez leídos y entregados por el usuario de destino, se eliminan del servidor y desaparecen.

Funcionalidad

La ventaja de un sistema como WhatsApp es que la comunicación y la transmisión de la información es prácticamente en tiempo real.

Por ello a la hora de implantar y descubrir el escenario técnico de la arquitectura de un sistema de mensajería instantánea, debemos pensar que debe incluir una serie de funcionalidades para que sea mínimamente óptimo como las múltiples de WhatsApp:

  • Los chats one-to-one
  • El envío de mensajes sin conexión
  • Los grupos
  • Debe permitir la participación de hasta 256 participantes
  • Los chats de video y los chats de video grupales
  • Los mensajes de voz
  • Debe ser capaz de compartir imagen, video y voz. Por cierto los videos no pueden pesar más de 16 MG, o tener una duración entre 90 segundos hasta 3 minutos
  • Debe indicar si están los mensajes leídos o la última hora de visualización por el usuario
  • La opción enviado, entregado, más la confirmación de lectura
  • Los archivos enviados tienen un límite de 100 MB
  • Tiene que ser capaz de soportar la reproducción de videos de Youtube, audio y video MP4, 3GP, MKV, AVI y MOV
  • Respuesta a mensajes en privado
  • Capacidad de copiar, guardar o archivar mensajes
  • Puede bloquear mensajes
  • Hacer fotos y grabar conversaciones, compartir ubicaciones y acceso a la lista de contactos.
  • Vinculación a otros dispositivos
  • Configurar la info, seguridad y privacidad del usuario

Sistema de arquitectura

 

Fuente: Medium

Base de datos de perfiles

En primer lugar, se deben recopilar y guardar información de los usuarios como el estado, la imagen de perfil, el ID de perfil y los detalles del contacto.

Es fundamental guardar en la nube (por ejemplo en un servicio similar o como el que ofrece S3 De Amazon) las imágenes de los usuarios cada una de ellas con sus enlaces.

📞✅ Arquitectura de un servicio de mensajería instantánea como WhatsApp #arquitecturaweb #desarrolloweb #lab Click To Tweet

Servicio de perfil (API)

Se permite publicar, agregar, actualizar o incluso recuperar la info de cada usuario.

La ventaja de un sistema como WhatsApp es que la comunicación y la transmisión de la información es prácticamente en tiempo real. Por ello a la hora de implantar y descubrir el escenario técnico de la arquitectura de un sistema de mensajería instantánea, debemos pensar que debe incluir una serie de funcionalidades para que sea mínimamente óptimo

Chat Server

Base de datos de Mapeo

También es importante tener clara la arquitectura de comunicación. Los usuarios A y B utilizan la comunicación bidireccional para comunicarse por la red, por tanto hay que conocer la dirección IP de cada uno.

Este proceso finaliza con un servidor, usuarios, el equilibrio de carga (que distribuye el tráfico entre varios servidores y evita la saturación de red) y la base de datos.

  • Resulta conveniente sustituir el protocolo HTTP donde cuando cada usuario cuando envía una solicitud o señal al servidor y se recibe respuesta, cierra la conexión, por el protocolo WebSocket, que aunque es un poco más complicado, es un servidor que funciona muy bien para aplicaciones en tiempo real y que mantendrá siempre una conexión continua entre los usuarios activos.

  • Durante el proceso estarán abiertos hasta 65K puertos. El controlador de sockets facilitará la información sobre los sockets web que están conectados a cada usuario. Redis se utiliza porque almacena y es capaz de facilitar tanto a qué controlador de socket web está conectado un usuario, como si se conecta a otro controlador en caso desconexión.
  • Servicio de mensajería. La API obtendrá un repositorio de toda la info de mensajes a través de varios filtros como la identificación del usuario, del mensaje, el estado de entrega, etc. Se puede integrar por ejemplo la solución big data de código abierto Cassandra desarrollada por Facebook, que es capaz de almacenar grandes cantidades de información.
  • A partir de aquí pueden suceder y desarrollarse varios escenarios:
    • El usuario A o remitente que envía la info está conectado al servidor, pero el receptor (usuario B) no; en este caso el mensaje se almacena en la base de datos y cuando el receptor se conecta, ese mensaje se envía de nuevo.
    • Que el remitente (A) no esté conectado al servidor; entonces ese mensaje se almacena (por ejemplo en una base de datos como SQLite), y cuando se conecta, es cuando se va a enviar al servidor.
    • Sin embargo, si ambos están conectados (A y B), el mensaje no se almacena, sino que se envía, viajará por el servidor de paso sin quedarse en él.
  • Mapeo de datos: Cada vez que un usuario envía un mensaje se genera un nuevo proceso en el que la información se almacena. El servidor del chat va a generar un nuevo proceso para el usuario A y con el usuario B si está en línea. El servidor identifica el nombre del receptor a través del PID (Process ID) y acto seguido se envía. El mismo proceso se repite a la inversa, cuando el usuario B va a responder al usuario A.

Servicio de chat grupal ¿Cómo funciona?

  • A diferencia de los chats one to one, tengamos en cuenta que por cada grupo que se crea en WhatsApp, se va a generar un nuevo GroupID, con una asignación de todos los usuarios que están incluidos. Cuando se envía un mensaje al grupo, el servicio de chat identifica el receptor, que en este caso pasará al group service para localizar el mismo ID de grupo y que envió mensajes a todos los ID de usuario de la lista.
  • En este caso los servidores web socket no van a realizar el seguimiento del grupo, sino de los usuarios del grupo activos. Entonces, cuando alguien lanza y envía un mensaje al grupo, el servidor contacta con el servicio de mensajes y estos se almacenarán en Cassandra. Luego se guardan en Kafka (que es transmisor de datos), que conectará con el servidor de mensajes grupales y los enviará todos. El servidor conectará con el group service, localizará la lista de miembros del grupo y entregará el mensaje a cada uno de ellos de forma individual.
  • El group service tiene controlada toda la información del grupo, cada uno de los miembros, el ID de usuario, ID de grupo, hasta la hora de creación, etc. datos que se deben guardar y almacenar en una base MySQL.

Mensajes vistos por última vez

El servicio que ofrece la mensajería instantánea y que permite comprobar la opción “vistos por última vez” utiliza una base de datos específica que almacena esta información.

Técnicamente cada vez que un usuario abre WhatsApp, el servidor contacta con esta opción para enviar los detalles de la hora.

Mensajes con archivos o multimedia

  • Una vez que el servicio de mensajería instantánea detecta el tipo de archivo que se ha enviado, se almacena en la nube (como la S3 de la que hablamos anteriormente). Los enlaces van a ir a una base de datos SQL con asignación a los detalles de usuario. En este caso sí se puede emplear HTTP para transferir los mensajes.
  • Las imágenes, archivos o vídeo que se hayan enviado se van a comprimir y cifrar, y este contenido cifrado llegará al receptor.

Front-end de WhatsApp

Cada una de las versiones de WhatsApp está hecha con un lenguaje diferente:

Versión Android: con Java
iOS: con Swift
Windows Teléfono: C#
La versión web: con JavaScript/HTML/CSS
La versión de escritorio Mac: Swift/Objective-C
La versión de escritorio para PC: C/C#/Java

Back-end de WhatsApp

Erlang es el principal lenguaje que se ha empleado para WhatsApp.
FreeBSD para el sistema operativo
Ejabberd es el servidor de aplicaciones XMPP
BEAM es la máquina virtual basada en Erlang
Mnesia es su base de datos basada en Erlang
YAWS es su servidor web multimedia

Juan José Fernández

Front end Developer

What’s up! Soy JJ y aunque me pillarás entre CSS´s y más códigos raros…
¿Te puedo ayudar en algo?

En el desarrollo web he encontrado mi auténtica vocación. Disfruto mucho viniendo a trabajar en moto y nunca dejo de aprender cosas nuevas junto a mis compañeros de equipo.

Mi tiempo libre lo disfruto con Negan y Lucifer (mis gatos), nunca se despegan de mi lado cuando extiendo la manta y suena el «tutún» de Netflix.

Suscríbete

Y recibe antes que nadie los consejos, novedades y técnicas que te ayudarán a hacer crecer tu negocio.