Diseño arquitectónico y práctica de un sistema de mensajería en tiempo real con decenas de millones de conexiones en la Estación B

Este artículo fue compartido por Huang Shancheng, ingeniero de desarrollo senior de Bilibili. El título original era "Diez mil sistemas de mensajes a largo plazo". Este artículo ha sido redactado y optimizado su contenido.

1. Introducción

En la era actual del entretenimiento digital, los bombardeos se han convertido en uno de los elementos interactivos indispensables en las plataformas de transmisión en vivo.

Al enviar bombardeos, enviar obsequios, etc., los usuarios pueden mostrar sus pensamientos, comentarios y contenido interactivo en la pantalla de transmisión en vivo en tiempo real, enriqueciendo así la experiencia de visualización del usuario. En este proceso, enviar información interactiva al terminal en tiempo real requiere el uso de conexiones largas.

Una conexión larga, como sugiere el nombre, es un canal de datos de red que se mantiene con el servidor durante la vida útil de la aplicación y puede admitir la transmisión de datos de enlace ascendente y descendente full-duplex. La mayor diferencia entre este y el servicio de conexión corta en el modo de respuesta a solicitud es que puede proporcionar al servidor la capacidad de enviar datos activamente a los usuarios en tiempo real.

Este artículo presentará el diseño arquitectónico y la práctica de decenas de millones de sistemas de mensajería en tiempo real de larga conexión implementados por Bilibili basados ​​en golang, incluido el diseño del marco del servicio de larga conexión, así como las optimizaciones relacionadas para estabilidad y alta rendimiento.

 

2. Artículos relacionados

3. Diseño de arquitectura

3.1 Descripción general

El servicio de conexión larga es una conexión larga compartida por varias partes comerciales.

Porque al diseñar, es necesario tener en cuenta las demandas de diferentes partes comerciales y diferentes escenarios comerciales para los servicios de conexión a largo plazo. Al mismo tiempo, también se deben considerar los límites de los servicios de conexión a largo plazo para evitar intervenir en el negocio. lógica y afectando la posterior iteración y desarrollo de servicios de conexión a largo plazo.

Los servicios de conexión larga se dividen principalmente en tres aspectos:

  • 1) Establecimiento, mantenimiento y gestión de conexiones largas;
  • 2) envío de datos de enlace descendente;
  • 3) Reenvío de datos de enlace ascendente (actualmente solo latidos, sin requisitos de escenarios comerciales reales).

3.2 Arquitectura general

La estructura general del servicio de conexión larga se muestra en la figura anterior. El servicio general incluye las siguientes partes.

1) Capa de control: llamada previa al establecimiento de la conexión, principalmente para verificación de legalidad de acceso, verificación de identidad y control de enrutamiento.

deber principal:

  • 1) Autenticación de identidad del usuario;
  • 2) Cifrar datos de ensamblaje y generar token legal;
  • 3) Programación dinámica y asignación de nodos de acceso.

2) Capa de acceso: servicio central de conexión larga, principalmente responsable de desinstalar certificados, acoplamiento de protocolos y mantenimiento de conexiones largas.

deber principal:

  • 1) Desinstalar certificados y protocolos;
  • 2) Responsable de establecer y mantener conexiones con los clientes y gestionar la relación de mapeo entre la identificación de conexión y la identificación de habitación;
  • 3) Procesar mensajes de enlace ascendente y descendente.

3) Capa lógica: capa de acceso simplificada, principalmente para funciones comerciales de conexión a largo plazo.

deber principal:

  • 1) Registros de informes de números en línea;
  • 2) Registre la relación de mapeo entre cada atributo del ID de conexión y cada nodo.
  • 4) Capa de distribución de mensajes: los mensajes se envían a la capa de acceso.

deber principal:

  • 1) La encapsulación, compresión y agregación de mensajes se envían a los nodos de borde correspondientes;

5) Capa de servicio: capa de acoplamiento de servicios comerciales, que proporciona una entrada para el envío de mensajes descendentes.

deber principal:

  • 1) Administrar y controlar los permisos push comerciales;
  • 2) Detección y reensamblaje de mensajes;
  • 3) El flujo de mensajes está limitado según ciertas políticas para proteger su propio sistema.

3.3 Proceso central

Las conexiones largas constan principalmente de tres procesos centrales:

  • 1) Establecer una conexión : iniciada por el cliente, primero a través de la capa de control para obtener el token legal y la configuración del punto de acceso del dispositivo;
  • 2) Mantener la conexión : principalmente el cliente inicia latidos regularmente para garantizar que la conexión larga esté activa;
  • 3) Empuje de enlace descendente : el servidor empresarial inicia el envío de enlace descendente. La capa de servicio determina el identificador de conexión y el nodo de acceso de acuerdo con el identificador relevante. A través de la capa de distribución de mensajes, el envío se envía a la capa de acceso correspondiente y se escribe en la capa designada. conexión y luego se distribuye al cliente.

3.4 Lista de funciones

Combinado con el escenario empresarial de la estación B, el envío de datos de enlace descendente proporciona las siguientes funciones generales:

  • 1) Mensajes a nivel de usuario: designados para ser enviados a ciertos usuarios (como enviar mensajes de invitación a un determinado ancla);
  • 2) Mensajes a nivel de dispositivo: desarrollar y enviar a ciertos dispositivos (por ejemplo, enviar instrucciones de informes de registros de clientes para dispositivos no registrados);
  • 3) Mensajes a nivel de sala: enviar mensajes a las conexiones en una determinada sala (como enviar mensajes de bombardeo a todos los usuarios en línea en la sala de transmisión en vivo);
  • 4) Mensajes de partición: enviar mensajes a salas en una determinada partición (por ejemplo, enviar una determinada actividad de ingresos a todas las salas que se transmiten en una determinada partición);
  • 5) Noticias de todo el distrito: mensajes push a todos los usuarios de la plataforma (como notificaciones push de eventos a todos los usuarios en línea).

4. Diseño de tecnología de alto rendimiento

A medida que el negocio se desarrolla y expande, hay cada vez más usuarios en línea y aumenta la presión sobre el sistema de conexión a largo plazo, especialmente la transmisión en vivo de eventos populares, por ejemplo, durante los S-Games, la cantidad de personas en línea. en toda la plataforma alcanzó decenas de millones y el rendimiento de mensajes alcanzó cientos de millones. El retraso promedio en la distribución de mensajes del sistema Changlian es de aproximadamente 1 segundo y la tasa de llegada de mensajes alcanza el 99%. medidas que Changlian ha tomado.

4.1 Protocolo de red

Elegir el protocolo de red correcto es fundamental para el rendimiento de un sistema de conexión larga:

  • 1) Protocolo TCP : puede proporcionar una conexión y transmisión de datos confiables y es adecuado para escenarios que requieren una alta confiabilidad de los datos;
  • 2) Protocolo UDP : es un protocolo poco confiable, pero tiene una alta eficiencia de transmisión y es adecuado para escenarios que no requieren una alta confiabilidad de los datos;
  • 3) Protocolo WebSocket : también realiza una comunicación bidireccional sin agregar demasiada sobrecarga y se usa más en el lado web.

La capa de acceso se divide en módulo de protocolo y módulo de conexión:

  • 1) Módulo de protocolo : interactúa con protocolos de capa de comunicación específicos y encapsula la interfaz y las diferencias lógicas de diferentes protocolos de comunicación.
  • 2) Módulo de conexión : mantiene el estado de las conexiones comerciales a largo plazo, admite la solicitud de enlaces ascendentes, descendentes y otras lógicas comerciales, mantiene los atributos de la conexión y la relación vinculante con la ID de la sala.

Con respecto al  punto 1) anterior , el módulo de protocolo también proporciona una interfaz de datos unificada para el módulo de conexión, incluido el establecimiento de conexión, lectura y escritura de datos, etc. Si se agregan nuevos protocolos en el futuro, siempre que la adaptación se realice en el módulo de protocolo, no afectará la lógica comercial a largo plazo de otros módulos.

Ventaja de:

  • 1) La lógica empresarial y los protocolos de comunicación están aislados para facilitar la adición iterativa de protocolos de comunicación y simplificar la dificultad de implementación de la compatibilidad con múltiples protocolos de comunicación;
  • 2) La capa de control puede emitir mejores protocolos de comunicación según la situación real del cliente.

4.2 Equilibrio de carga

La tecnología de equilibrio de carga se puede utilizar para distribuir solicitudes a diferentes nodos del servidor para su procesamiento, evitando una carga excesiva en un solo nodo y mejorando la escalabilidad y estabilidad del sistema.

La conexión a largo plazo agrega una capa de control para el equilibrio de carga. La capa de control proporciona una interfaz de conexión corta http y selecciona dinámicamente el nodo de acceso apropiado en función de la situación real del cliente y de cada nodo de borde y el principio de proximidad.

La capa de acceso admite la expansión horizontal y la capa de control puede agregar y reducir nodos de asignación en tiempo real. Durante el juego S, cuando la cantidad de personas en línea se acercaba a decenas de millones, cada nodo de acceso estaba equilibrado y programado para garantizar que la CPU y la memoria de cada nodo estuvieran dentro de un rango estable.

4.3 Cola de mensajes

El enlace de envío de mensajes es: la empresa envía el envío, lo envía al nodo perimetral a través de la capa de servicio y luego lo entrega al cliente.

La capa de servicio se distribuye a cada nodo perimetral en tiempo real. Si se trata de un mensaje de tipo sala, debe enviarse a varios nodos perimetrales. La capa de servicio también procesa la lógica empresarial, lo que afecta en gran medida el rendimiento del mensaje.

Por lo tanto, se agregan la cola de mensajes y la capa de distribución de mensajes. La capa de distribución de mensajes mantiene la información de cada nodo de borde y envía mensajes, lo que mejora la capacidad de procesamiento concurrente y la estabilidad del sistema y evita problemas de rendimiento causados ​​por el bloqueo de envío de mensajes.

4.4 Agregación de mensajes

Cuando hay un evento popular, el número de personas en línea al mismo tiempo puede llegar a decenas de millones, y se difundirá un bombardeo de mensajes a decenas de millones de terminales. Si todos en línea envían un mensaje cada segundo, la cantidad de mensajes que. Lo que se necesita enviar es 1kw * 1kw, que es una cantidad muy grande de mensajes. En este momento, la capa de distribución de mensajes y la capa de acceso estarán bajo una gran presión.

El análisis encontró que todos estos mensajes provienen de la misma sala y pertenecen a salas calientes, como la sala de juegos S. La cantidad de espectadores no se puede reducir, por lo que solo podemos preocuparnos por la cantidad de mensajes. La difusión de mensajes comerciales no se puede reducir y se debe reducir la cantidad de mensajes difundidos, por lo que se pensó en la agregación de mensajes.

Para los mensajes de sala, la agregación de mensajes se lleva a cabo de acuerdo con ciertas reglas y se envía en lotes:

Una vez que la agregación de mensajes se conecta, el QPS llamado por la capa de distribución de mensajes a la capa de acceso se reduce en aproximadamente un 60%, lo que reduce en gran medida la presión sobre la capa de acceso y la capa de distribución de mensajes.

4.5 Algoritmo de compresión

Después de la agregación de mensajes, la cantidad de mensajes se reduce, pero el tamaño del cuerpo del mensaje aumenta, lo que afecta la escritura IO. Si es necesario reducir el tamaño del cuerpo del mensaje, se piensa en la compresión del mensaje.

Para los algoritmos de compresión, seleccionamos dos de uso común en el mercado: zlib y brotli para comparar.

Capturamos los datos enviados por el negocio en línea, seleccionamos el nivel de compresión más alto y pasamos la verificación de compresión:

Se puede ver que brotli tiene grandes ventajas sobre zlib, y finalmente se eligió el algoritmo de compresión brotli.

Elija realizar la compresión de mensajes en la capa de distribución de mensajes para evitar la compresión repetida en cada nodo de acceso y la pérdida de rendimiento. Después de conectarse, no solo mejora el rendimiento, sino que también reduce los costos de uso de banda ancha.

5. Diseño de tecnología de garantía de servicio.

Hoy en día, algunas empresas dependen en gran medida de los mensajes push a largo plazo. La pérdida de mensajes afectará la experiencia del usuario en el mejor de los casos y, en el peor, bloqueará los procesos comerciales posteriores, lo que afectará el flujo comercial. Para garantizar la garantía de mensajes de servicio a largo plazo, se ha realizado el siguiente trabajo.

5.1 Despliegue multiactivo

La implementación multiactiva, al implementar la misma arquitectura del sistema y servicios en diferentes ubicaciones geográficas, logra una rápida conmutación por error del sistema en caso de una sola falla geográfica, mejorando así la estabilidad y disponibilidad del sistema.

La implementación de servicios a largo plazo implica principalmente los siguientes puntos:

  • 1) LongConnect ha implementado puntos de acceso en el este de China, el sur de China y el norte de China, dando soporte a los tres principales operadores. También se han implementado puntos de acceso en salas de computadoras de construcción propia en el sur de China y en el centro de China para brindar soporte a los usuarios extranjeros y el acceso independiente; a las salas de informática de Singapur se le ha añadido un punto;
  • 2) Para diferentes escenarios comerciales, cambie entre nodos de nube y nodos de construcción propia en tiempo real. Debido a que los costos de los nodos de nube y las salas de computadoras de construcción propia son diferentes, los costos deben controlarse tanto como sea posible garantizando al mismo tiempo la calidad del servicio.

Durante la operación en línea actual, ocasionalmente se encuentran fluctuaciones en la red de nodos individuales o salas de computadoras. A través de la capa de control, los nodos problemáticos se eliminan en segundos, lo que reduce en gran medida el impacto en el negocio.

5.2 Canales de mensajes altos y bajos

Los mensajes multiservicio acceden a conexiones largas, pero la importancia de los diferentes mensajes es diferente, como los mensajes de bombardeo y los mensajes de paquete de invitación. Perder algunos mensajes de bombardeo no tendrá un gran impacto en la experiencia del usuario, pero si se pierde el mensaje de paquete de invitación. , hará que la empresa pk no pueda continuar con procesos posteriores.

Para diferentes niveles de mensajes, se utilizan canales de mensajes de alta y baja calidad. Las noticias importantes van al canal de alta calidad y las noticias ordinarias van al canal de baja calidad. De esta manera, los mensajes importantes y ordinarios están físicamente separados y la distribución de mensajes prioriza los mensajes importantes.

Para canales de alta calidad, se garantiza la entrega dual y se realiza una deduplicación idempotente en la capa de acceso. En primer lugar, los mensajes importantes son para el nivel de usuario y el volumen no será muy grande, por lo que la presión sobre la capa de acceso no aumentará mucho. Además, los trabajos de entrega dual se implementan en varias salas de ordenadores, lo que reduce el impacto de la fluctuación de la red en una sola sala de ordenadores.

Después de que los canales de alta y baja calidad se conectaron, encontramos nerviosismo saliente en la intranet. En ese momento, los nodos de trabajo afiliados a la intranet enviaban mensajes de manera anormal, pero los nodos de trabajo de alta calidad en la nube podían enviar mensajes normalmente. aseguró la llegada de mensajes de alta calidad y, por lo tanto, garantizó que los servicios de alta calidad no se verán afectados.

5.3 funciones de Gundam

El canal de optimización alto-bajo resuelve el vínculo entre el trabajo y la capa de acceso, pero la conexión de envío de mensajes implica múltiples vínculos, como la capa de servicio al trabajo y la capa de acceso al cliente.

Para todo el enlace, la tasa de llegada al terminal se garantiza mediante la implementación del mecanismo de alcance obligado, denominado función de alcance.

Implementación de funciones:

  • 1) Cada mensaje introduce msgID y el cliente realiza una deduplicación idempotente y acuse de recibo después de recibir el mensaje;
  • 2) El servidor realiza una detección de confirmación en msgid y, si no hay confirmación, el servidor volverá a intentar la entrega dentro del período de validez.

Tasa de llegada final = (1-(1-r)^(n+1)), donde: r es la tasa de llegada única de la transmisión y n es el número máximo de reintentos.

Por ejemplo: r = 97%, n=2, entonces la tasa de llegada final puede alcanzar (1-(1-0,97)^(2+1)) = 99,9973%

6. Diseño de garantía de entrega de mensajes que entran y salen de la "sala"

Algunos escenarios comerciales requieren el uso de información de entrada y salida del usuario. Por ejemplo, cuando el usuario A ingresa a la sala de transmisión en vivo, la página mostrará un mensaje de bienvenida al usuario A para ingresar a la sala o unirse a la lista en línea.

1) Se perderá la información de entrada a la habitación y se necesitará un mecanismo de compensación. Pensé que el mensaje de entrada a la sala podría compensarse conectándose al latido, pero el latido es continuo durante el período de conexión en línea, la empresa espera recibir el mensaje de entrada a la sala solo una vez, por lo que el mensaje de entrada a la sala debe tener un idempotente. mecanismo.

2) La información de salida de la habitación también se perderá. Si se pierde, la empresa no podrá eliminar a los usuarios de la lista en línea. También se necesita un mecanismo de compensación en este momento. En este momento, debe agregar una máquina de estado para la conexión y mantener la máquina de estado a través de latidos. Cuando se pierde el latido, la conexión se considera desconectada y el usuario se desconecta.

7. Planificación futura

Después de varias iteraciones del servicio unificado de conexión larga, las funciones básicas se han vuelto estables y el servicio de conexión larga se mejorará y optimizará en el futuro.

Centrarse principalmente en las siguientes direcciones:

  • 1) Dataización : mejorar aún más la capacidad de recopilar estadísticas de datos de calidad de red de enlace completo de conexión larga y seguimiento de enlace completo de mensajes de alto valor;
  • 2) Inteligencia : el establecimiento de la conexión en el dispositivo, la selección del punto de acceso, etc. se pueden ajustar automáticamente según el entorno real;
  • 3) Optimización del rendimiento : en el módulo de conexión de la capa de acceso, los Ctrips que procesan mensajes de enlace ascendente y descendente se comparten, lo que reduce la cantidad de Ctrips en la capa de acceso y mejora aún más el rendimiento de una sola máquina y la cantidad de conexiones;
  • 4) Expansión de funciones : función de mensajería sin conexión agregada, etc.

8. Materiales de referencia

[1]  Enseñarle paso a paso cómo escribir una conexión Socket larga basada en TCP

[2]  Comprender correctamente los mecanismos de conexión larga, latidos y reconexión de mensajería instantánea e implementarlos de manera práctica

[3]  Artículo extenso de 10,000 palabras: Enseñarle paso a paso cómo implementar un mecanismo eficiente de mantenimiento de latido del corazón adaptativo de conexión larga de mensajería instantánea

[4]  Utilice la tecnología JWT para resolver los problemas de autenticación de identidad de la conexión larga del socket del sistema de mensajería instantánea

[5]  Explicación detallada de TCP/IP  -  Capítulo 11·UDP: Protocolo de datagramas de usuario

[6]  Explicación detallada de TCP/IP  -  Capítulo 17·TCP: Protocolo de control de transmisión

[7]  Desde principiantes hasta expertos en WebSocket, ¡media hora es suficiente!

[8]  Un artículo es suficiente para comprender rápidamente el protocolo TCP.

[9]  Comprenda rápidamente las diferencias entre TCP y UDP

[10]  Con solo hacer pis, puedes comprender rápidamente la diferencia entre TCP y UDP

[11]  ¿Qué es exactamente Socket? ¡Entiéndalo en un artículo!

[12]  Cuando leemos y escribimos Socket, ¿qué estamos leyendo y escribiendo exactamente?

[13]  Si tuvieras que diseñar el protocolo TCP, ¿qué harías?

[14]  Profundice en el sistema operativo y comprenda qué es Socket en un artículo

[15]  Es fácil entender cómo se implementan los servidores de alto rendimiento.

[16]  Iluminación traída por la captura de boletos 12306: vea cómo uso Go para implementar un sistema de venta flash de un millón de QPS (incluido el código fuente)

 Intercambio de tecnología:

- Un artículo introductorio sobre el desarrollo de mensajería instantánea móvil: " Un artículo es suficiente para principiantes: Desarrollar mensajería instantánea móvil desde cero "

- Código fuente del marco de mensajería instantánea de código abierto: https://github.com/JackJiang2011/MobileIMSDK ( dirección alternativa, haga clic aquí )

(Este artículo ha sido publicado simultáneamente en: http://www.52im.net/thread-4647-1-1.html )

El equipo de inteligencia artificial de China de Microsoft empacó colectivamente y se fue a los Estados Unidos, involucrando a cientos de personas. ¿Cuántos ingresos puede generar un proyecto desconocido de código abierto? Huawei anunció oficialmente que la posición de Yu Chengdong se ajustó en la estación espejo de código abierto de la Universidad de Ciencia y Tecnología de Huazhong. ¡Los estafadores abrieron oficialmente el acceso a la red externa y utilizaron TeamViewer para transferir 3,98 millones! ¿Qué deberían hacer los proveedores de escritorio remoto? La primera biblioteca de visualización front-end y fundador del conocido proyecto de código abierto de Baidu, ECharts, un ex empleado de una conocida empresa de código abierto que "se fue al mar" dio la noticia: después de ser desafiado por sus subordinados, el técnico El líder se puso furioso y grosero y despidió a la empleada embarazada. OpenAI consideró permitir que la IA genere contenido pornográfico. Microsoft informó a The Rust Foundation que donó 1 millón de dólares estadounidenses. Por favor, dígame cuál es el papel de time.sleep(6) aquí. ?
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/jb2011/blog/11139830
Recomendado
Clasificación