Desarrollo del sistema IM de mensajería instantánea
①Modo P2P
El chat dentro de la red de área local utiliza principalmente el modo P2P, que tiene varias limitaciones e inconvenientes. Por un lado, solo es adecuado para mensajería punto a punto en línea y no tiene suficiente soporte para soporte grupal y fuera de línea. Por otro lado, debido a la existencia de NAT, es mucho más difícil interconectar máquinas en diferentes LAN y no se pueden establecer conexiones bajo ciertos tipos de red (NAT simétrica). El software que utiliza el modo P2P generalmente hará dos cosas después de iniciarse:
1. Transmisión UDP: envía su propia información y recibe otra información dentro de la misma LAN.
2. Active la monitorización TCP: espere a que se conecten otros terminales.
②Modo de transmisión del servidor
La mayoría de los productos de mensajería instantánea de Internet utilizan la retransmisión del servidor para la transmisión de mensajes. En comparación con P2P, tiene las siguientes ventajas:
1. que P2P no puede o no puede admitir, como mensajes fuera de línea, grupos, salas de chat, etc.
2. Facilitar la expansión de la lógica de negocio y la compatibilidad entre versiones antiguas y nuevas. Por supuesto, también tiene sus propios problemas, es decir, la arquitectura del servidor es compleja y los requisitos de concurrencia son altos.
A través de la comparación anterior, se recomienda que utilicemos el método de migración del servidor al desarrollar sistemas de mensajería instantánea.
Existen dos métodos de conexión de red de mensajería instantánea: conexión larga basada en TCP y conexión corta basada en HTTP:
①conexión larga basada en TCP
larga basada en TCP Las conexiones pueden admitir mejor una gran cantidad de usuarios, pero el problema es que la implementación del cliente y el servidor es relativamente compleja. También hay algunas mejoras, como MQTT para la entrega de mensajes/notificaciones del servidor descendente y conexiones cortas HTTP para instrucciones ascendentes y carga de mensajes. Este método puede garantizar la puntualidad de los mensajes/instrucciones del enlace descendente, pero el problema del enlace ascendente lento sigue siendo grave en condiciones de red débiles. Todas las primeras comunicaciones se basaban en este método.
②Conexión corta basada en HTTP.
Común en los sistemas de mensajería instantánea WEB (muchos WEBIM ahora se implementan basándose en WebSocket), las ventajas son una implementación simple y un desarrollo fácil, pero el problema es el gran tráfico, la carga pesada del servidor, la puntualidad deficiente de los mensajes y es difícil para usuarios a gran escala. Soporte insuficiente, adecuado para sistemas IM pequeños.
Los protocolos comúnmente utilizados para mensajería instantánea incluyen: XMPP, MQTT y protocolos privados. Las ventajas y desventajas de varios protocolos son las siguientes:
①Protocolo XMPP
Ventajas: el protocolo es de código abierto, extensible y se puede implementar en varios idiomas. Es una buena opción. para desarrolladores principiantes, lo cual es conveniente para que los programadores que se dedican al desarrollo de mensajería instantánea comiencen rápidamente.
Desventajas: XML tiene un poder expresivo débil, demasiada información redundante y mucho tráfico.
Casos comunes: Gtalk, Sina Weibo, Facebook.
②Protocolo MQTT
Ventajas: El protocolo es simple y el tráfico es pequeño.
Desventajas: No es un protocolo diseñado específicamente para mensajería instantánea y se utiliza principalmente para push.
③Protocolo privado
Casi todos los IMAP convencionales utilizan protocolos propietarios.
Ventajas: alta eficiencia, ahorro de tráfico (generalmente mediante protocolo binario), alta seguridad y no es fácil de descifrar.
Desventajas: no existe una lista de muestra a la que consultar en la etapa inicial de desarrollo y los requisitos para los programadores involucrados en el desarrollo de mensajería instantánea son relativamente altos.
Casos habituales: WeChat, DingTalk.
Basándonos en la comparación anterior, llegamos a la conclusión de que un buen protocolo debe cumplir con los requisitos de eficiencia, simplicidad, ahorro de tráfico y fácil expansión y, al mismo tiempo, puede igualar la pila tecnológica del equipo de desarrollo actual. No puedes elegir uno de ellos. Es difícil comenzar.
La misma frase permanece aquí. Cuando desarrollé el sistema de mensajería instantánea, utilicé XMPP. Durante el uso, encontré muchos problemas y dificultades.
①Principio de tiempo real
El mensaje llega al destinatario en tiempo real. Si el usuario está en línea, los mensajes llegan en tiempo real. Si el usuario no está en línea, el mensaje llegará después de que el usuario inicie sesión.
Debido a las fluctuaciones de la red y la gestión de la conmutación de front-end y back-end por parte de los sistemas operativos móviles, el sistema de mensajería instantánea debe considerar cómo implementar la gestión de conexiones de usuario, el envío de mensajes en tiempo real, cómo manejar las fallas de envío y el mecanismo de reconexión del cliente. y cómo completar mensajes. Debido a la complejidad del desarrollo de TCP, las primeras soluciones técnicas ineficientes basadas en sondeos cortos y largos de HTTP no pudieron cumplir con los requisitos en tiempo real.
②Principio de confiabilidad
Se refiere a la "entrega de mensajes" que escuchamos a menudo, que generalmente está representada por dos indicadores técnicos: los mensajes no se pierden y no se repiten. La confiabilidad es garantizar que el receptor pueda recibir el mensaje después de enviarlo. Debido a la complejidad del entorno de red y la incertidumbre de los usuarios en línea, la confiabilidad de los mensajes (sin pérdida, sin duplicación) es el indicador central del sistema de mensajería instantánea, y también es una de las dificultades en la implementación del sistema de mensajería instantánea. . En términos generales, la "confiabilidad" del mensaje del sistema de mensajería instantánea generalmente se refiere a la confiabilidad de la entrega de mensajes de chat (precisamente, este "mensaje" es amplio, porque hay varias instrucciones y notificaciones que los usuarios no pueden ver, incluidas, entre otras, notificaciones de unirse a un grupo, notificaciones para agregar amigos, etc., para facilitar la descripción, se denominan colectivamente "mensajes").
A partir del comportamiento del usuario del remitente y del receptor del mensaje, la "confiabilidad" del mensaje debe dividirse en las siguientes situaciones:
1. Fallo en el envío: debemos ser conscientes de ello. En este caso, brinde al remitente una respuesta clara. Si el correo electrónico no tiene éxito, el remitente puede optar por volver a intentarlo o intentarlo más tarde.
2. Enviado exitosamente: Si el destinatario está en línea, debería recibir el mensaje inmediatamente. Si el receptor está desconectado y no puede recibir el mensaje, lo recibirá tan pronto como se conecte.
3. Los mensajes no se pueden repetir: En definitiva, un mensaje enviado no se puede recibir repetidamente.
③Principio de coherencia
En el sistema, se debe prestar atención a la secuencia temporal de los mensajes y el orden en que se envían los mensajes no se puede revertir. Los problemas de sincronización generalmente se deben a las siguientes razones:
1. El retraso en la transmisión de la red causa inconsistencia en la sincronización. La demora en que los mensajes enviados por diferentes usuarios llegan al servidor varía mucho, lo que plantea desafíos en cuanto a la sincronización de los mensajes. Este problema se encuentra a menudo durante el desarrollo temprano.
2. La aparición de sistemas distribuidos genera inconsistencias en los tiempos. Hay muchos módulos en el sistema de mensajería instantánea, como la capa de acceso, la capa de lógica de mensajes, etc., y cada capa está distribuida y agrupada. Estas aplicaciones se distribuyen en diferentes máquinas, por lo que es difícil garantizar el tiempo.
④Principio de desarrollo
La extensibilidad es un tema que debe considerarse en la etapa posterior del sistema de mensajería instantánea, incluida la expansión de funciones y la expansión del servidor. No entraré en detalles esta vez.
Mina y Netty son marcos de aplicaciones de red para aplicaciones de red de alto rendimiento y altamente escalables en el campo de Java.
Mina es un proyecto de la organización Apache que proporciona un marco para desarrollar aplicaciones de red de alto rendimiento y alta disponibilidad. La versión actual de Mina admite el desarrollo de aplicaciones TCP/UDP y programas de comunicación en serie basados en la tecnología Java NIO. El software que actualmente utiliza Mina incluye Apache Directory Project, AsyncWeb, AMQP (Protocolo avanzado de cola de mensajes), red 5 Server (Macromedia Flash Media RTMP), ObjectRADIUS, Openfire, etc.
Netty es un framework de código abierto de Java proporcionado por JBOSS. Netty proporciona marcos y herramientas de aplicaciones de red asincrónicas y basadas en eventos para desarrollar rápidamente programas de cliente y servidor de red de alto rendimiento y confiabilidad. En otras palabras, Netty es un marco del lado del cliente y del servidor basado en NIO. El uso de Netty garantiza que pueda desarrollar una aplicación web de forma rápida y sencilla.
Aunque he usado Mina, recomiendo usar Netty durante el desarrollo y selección. Debido a que Netty es compatible con el protocolo buf de Google, tiene soporte para contenedores ioc más completo (spring, guice, jbossmc, osgi).
Mina no se actualizará después de actualizar a 2.0, pero Netty sí se actualizó. La última versión se ha actualizado a 4.1. Desde la perspectiva de las actualizaciones de versiones, podemos ver que la comunidad de Netty es muy activa y los problemas se solucionan todo el tiempo, lo que nos brindará mucha comodidad a la hora de elegirlo para el desarrollo.
Un solo sistema Netty IM puede admitir 6,5438 millones de concurrencias y, si el rendimiento de la máquina es bueno, puede superar los 6,5438 millones.
Los sistemas distribuidos de mensajería instantánea Netty pueden admitir una mayor concurrencia. Las funciones de cada componente son las siguientes:
①IM Server Connector: Se utiliza principalmente para mantener la conexión TCP con el cliente.
②Caché: responsable de almacenar en caché los usuarios, las relaciones vinculantes de los usuarios y las relaciones de los grupos de usuarios. Caché de datos temporales para acelerar la lectura. Se puede convertir en modo clúster.
③Base de datos: usuarios, grupos, mensajes offline. Se puede convertir en modo clúster.
④Cola de mensajes: difusión del estado del usuario y difusión de mensajes grupales. Se puede convertir en modo clúster.
Se recomienda Netty-4.1.30 para el entorno de desarrollo y 1.8 o superior para jdk. Como se muestra a continuación:
io.netty
netty-all
4.1.30
① Usando Netty Spring (Spring4.x) como marco de desarrollo.
②La primavera usa nubes primaverales. La arquitectura de microservicio distribuido basada en una conexión corta y tranquila completa la gestión en línea del usuario y el sistema de inicio de sesión único.
③La cola de mensajes utiliza la cola de alta velocidad rocketMQ para la rectificación.
④La base de datos utiliza MYSQL.
⑤El paquete de datos personalizado del protocolo JSON utiliza Fastjson.
Hay muchos códigos de mensajería instantánea de código abierto basados en Netty en Internet, por lo que no los enumeraré todos aquí. Puedes descargarlos en git tú mismo. Creo que la clave es aclarar el concepto, elegir la pila de tecnología y determinar el marco general. El siguiente paso es desarrollar un sistema de mensajería instantánea adecuado para pequeñas y medianas empresas, pero hay que considerar la escalabilidad posterior, porque un buen producto no puede ser utilizado por sí solo, sino que debe ser utilizado por más personas.