Netty se da cuenta del centro de mensajes

1. Requisitos

Deben realizarse las siguientes funciones de la sala de transmisión en vivo:

  • Mensajes masivos (texto, imágenes, productos recomendados)
  • Mensajes privados punto a punto (texto, imágenes, productos recomendados)
  • Prohibición de usuario único
  • Todos los usuarios prohibidos
  • Retirar mensaje
  • Historial de chat persistente

2. Realización técnica

El centro de mensajes del lado del servidor se implementa con netty, las
microestaciones y los applets usan websocket para comunicarse con el centro de mensajes, y el
terminal de Android usa netty para comunicarse con el centro de mensajes.

El servidor enviará un mensaje ping al cliente cada cierto tiempo. Después de recibir el mensaje ping, el cliente responde al mensaje pong. El latido verifica al cliente superviviente, desconecta periódicamente el enlace al mensaje pong que no responde y elimina la información de la sesión de conexión del servidor.
Después de que el cliente desconecta el enlace debido a problemas de red y de otro tipo, el cliente necesita implementar un mecanismo de reconexión regular, primero configurado para intentar reconectarse cada 5 segundos después de la desconexión, esta vez puede modificarse más tarde.

Dirección de enlace del servidor: ws: // {ip}: {port} / websocket? LiveId = 123 & userId = 00b084ea98e24e80a7f8be3c4b8a64d0
liveId es la identificación en vivo, userId es la identificación de usuario

1. Formato del
mensaje El mensaje es una cadena de formato json con los siguientes atributos:

Nombre del campo Tipo Significado Si el cliente es requerido
carné de identidad cuerda uuid, generado por el servidor No lleno
LiveID cuerda Identificación en vivo Requerido
código En t Tipo de mensaje del sistema Requerido
tipo En t Tipo de mensaje comercial Se requiere un mensaje comercial, pero el mensaje de latido no es
mensaje cuerda Contenido del mensaje Obligatorio, el mensaje de latido no está lleno
sendUserId cuerda ID de usuario del remitente Requerido
Enviar Nombre de Usuario cuerda Nombre de usuario del remitente No lleno, el servidor vuelve
sendUserHeadImg cuerda Avatar del remitente No lleno, el servidor vuelve
recibirUsuarioUsuario cuerda[] Matriz de ID de usuario destinatario no se requiere código para el envío masivo, se requiere chat privado
hora de envío cuerda Tiempo de envío, generado por el servidor, formato: aaaa-MM-dd HH: mm: ss No lleno
ext cuerda Información extendida Opcional

Definición del código del mensaje

código Significado
1 Punto a punto
2 A granel
3 Mensaje de ping, latido del servidor enviado al cliente
4 4 mensaje pong, el cliente responde al mensaje pong después de recibir el mensaje ping

Definición del tipo de mensaje

tipo Significado
1001 Mensaje de texto sin formato
1002 Mensaje de imagen
1003 Noticias de producto recomendadas
1004 Mensaje prohibido de un solo usuario
1005 Todos los usuarios prohibieron los mensajes.
1006 Retirar mensaje de voz del usuario
1007 Noticias de recompensa

pong 消息 示例 :
{
"código": 4,
"liveId": "asfasda",
"sendUserId": "sfasdasdasd"
}

Ejemplos de mensajes de texto ordinarios:
{
"id": "fasdasdasd",
"liveId": "fasdasdas",
"code": 2,
"msg":
"Hello" , "sendUserId": "Esto es del remitente ID de usuario ",
" sendUserName ":" asfasdas ",
" sendUserHeadImg ":" fasdasdasdsad.jpg ",
" acceptUserId ":" Esta es la identificación de usuario del destinatario ",
" type ": 1001,
" sendTime ": 133548798798,
" ext ":" {} "
}

b. Ejemplos de mensajes de texto ordinarios con emoticones:
{
"id": "fasdasdasd",
"liveId": "fasdasdas",
"code": 10001,
"msg":
"Hello [smile]", "sendUserId": "Este es el ID de usuario del remitente",
"sendUserName": "asfasdas",
"sendUserHeadImg": "fasdasdasdsad.jpg",
"acceptUserId": "Este es el ID de usuario del destinatario",
"type": 1,
"sendTime ": 133548798798,
" ext ":" {} "
}
Nota: [smile] es el identificador de cadena de la imagen del emoticón smile. Después de recibir este mensaje, el cliente debe reemplazar el emoticon con la imagen y mostrarlo en la ventana de chat.

c. Ejemplo de mensaje de imagen:
primero comprima el archivo de imagen en el lado del cliente, intente controlarlo dentro de 1M, y luego llame a la interfaz de carga de imagen para obtener la ruta relativa de la imagen. Si la carga es exitosa, ensamble el mensaje websocket y ponga la ruta en msg:
{
"id": " fasdasd ",
" liveId ":" fasdasdas ",
" código ": 2,
" msg ":" / static / img / chat / 2020-02-11 / xxx.jpg ",
" sendUserId ":" Esto es del remitente ID de usuario ",
" sendUserName ":" asfasdas ",
" sendUserHeadImg ":" fasdasdasdsad.jpg ",
" acceptUserId ":" Esta es la identificación de usuario del destinatario ",
" type ": 1002,
" sendTime ": 133548798798,
" ext ":" {} "
}

d. Ejemplo de mensaje de producto recomendado:
El campo msg de los productos recomendados es la información del producto json
{
"id": "asfasdsdads",
"liveId": "fasdasdas",
"code": 2,
"msg": "{" productId ":" asdasfas "," productType ": 1," originPrice ": 100," currentPrice ": 100," productName ":" sfasd "," coverImg ":" asfasdasd.jpg "}",
"sendUserId": "Este es el remitente ID de usuario ",
" sendUserName ":" asfasdas ",
" sendUserHeadImg ":" fasdasdasdsad.jpg ",
" acceptUserId ":" Esta es la identificación de usuario del destinatario ",
" type ": 1003,
" sendTime ": 133548798798
}

e. Ejemplo de mensaje de recompensa:
{
"id": "fasdasd",
"liveId": "fasdasdas",
"código": 2,
"msg": "/ static / img / chat / 2020-02-11 / xxx. jpg ",
" sendUserId ":" Este es el ID de usuario del remitente ",
" acceptUserId ":" ",
" type ": 1007,
" sendTime ": 133548798798,
" ext ":" {"name": "fue recompensado Nombre de usuario del usuario "," precio ": 100}"
}

f) Ejemplo de un mensaje prohibido de un solo usuario:
{
"id": "fasdasd",
"liveId": "fasdasdas",
"código": 2,
"msg": "id del usuario prohibido",
"sendUserId": " Esta es la identificación de usuario del remitente ",
" acceptUserId ":" Esta es la identificación de usuario del receptor ",
" type ": 1004,
" sendTime ": 133548798798,
" ext ":" {'name': 'está prohibido Nombre de usuario '} ”
}

f. Ejemplo de mensaje de silencio de usuario único:
{
"id": "fasdasd",
"liveId": "fasdasdas",
"código": 2,
"msg": "id del usuario cuyo
silencio se canceló", "sendUserId" : "Esta es la identificación de usuario del remitente",
"acceptUserId": "Esta es la identificación de usuario del remitente",
"type": 1010,
"sendTime": 133548798798,
"ext": "{'name': 'está prohibido的 的 nombre de usuario '} ”
}

f. Ejemplo de mensaje de retiro:
{
"id": "fasdasd",
"liveId": "fasdasdas",
"code": 2,
"msg": "el id del mensaje que fue revocado",
"sendUserId": "Este es el remitente Id. De usuario ",
" acceptUserId ":" Este es el id. De usuario del destinatario ",
" type ": 1006,
" sendTime ": 133548798798,
" ext ":" "
}

2. Proceso de interacción del mensaje
image.png

Pasos para recibir mensajes:

a. Cuando el usuario abre la página de presentación en vivo, inicia una solicitud de establecimiento de conexión al centro de registro y escucha los mensajes enviados por el centro de mensajes.

b) Cuando el mensaje enviado por el centro de mensajes activa la función de evento de supervisión, se determina que el tipo es uno de mensajes de texto ordinarios, mensajes de sistema y mensajes de productos recomendados, y luego se realiza el procesamiento lógico y la visualización correspondientes.

Enviar pasos del mensaje:

a. Cuando el usuario abre la página de presentación en vivo, inicia una solicitud de establecimiento de conexión al centro de registro y escucha los mensajes enviados por el centro de mensajes.

b. Si es un mensaje de texto de chat normal o un mensaje del sistema, el mensaje json se ensambla de acuerdo con el formato de mensaje acordado. Si se trata de un mensaje con imagen, primero llame a la interfaz de carga de imágenes para obtener la url y ensamble la url en el mensaje json, llame a websocket o sdk al centro de mensajes Envía un mensaje

Pasos para retirar el mensaje:

a. Cuando el asistente de enseñanza e ibos hagan clic para retirarse, arme un mensaje con el tipo de retiro, el código como el tipo de envío grupal y el campo de mensaje como la identificación del mensaje que se va a retirar, y envíelo al centro de mensajes.

b. Después de recibir este mensaje, el centro de mensajes cambia el estado del mensaje en mongodb para retirar y difunde el mensaje retirado a todos los clientes.

c. Después de recibir el mensaje, el cliente de difusión oculta el mensaje correspondiente por ID de mensaje.

Paso de silencio de usuario único

a. Cuando el asistente de enseñanza e ibos hacen clic en el silencio del usuario, reúnen un mensaje cuyo tipo es silencio, el código es un tipo de chat privado punto a punto, y el campo msg es la identificación del usuario que debe silenciarse, y se envía al centro de mensajes.

b. Después de recibir este mensaje, el centro de mensajes mantendrá el estado de silencio del usuario en la base de datos y registrará la relación entre la transmisión en vivo y el silencio del usuario en la memoria caché. Si el cliente del usuario aún mantiene una conexión de sesión, empuje el cliente del usuario prohibido de igual a igual.

c. Después de que el cliente del usuario prohibido reciba el mensaje, el cuadro de texto se deshabilita y se solicita al usuario que se lo prohíba.

Nota:
Cuando el usuario actualiza la página, el último estado de silencio se obtendrá de la base de datos y el cuadro de texto se deshabilitará / habilitará. En casos extremos, el usuario envía un mensaje. Cuando el mensaje pasa al centro de mensajes, verificará si hay una prohibición para el usuario de transmisión en vivo en la memoria caché. Si lo hay, el mensaje no será empujado.
Los pasos interactivos para cancelar el silencio de un solo usuario son los mismos que los pasos anteriores, excepto que el tipo de mensaje es cancelar el silencio.

Pasos para silenciar a todos los usuarios

a. Cuando el asistente de enseñanza y el ibos hagan clic en el silencio de todos los usuarios, el estado de silencio de la transmisión en vivo se mantendrá en la base de datos, y el estado de silencio de la transmisión en vivo se grabará en la memoria caché. Arme un mensaje cuyo tipo esté totalmente prohibido y se transmita el código, y envíelo al centro de mensajes.

b. El centro de mensajes transmite el mensaje a todos los clientes que miran la transmisión en vivo.

c. Después de que el cliente recibe el mensaje, el cuadro de texto se deshabilita.

Nota:
Cuando el usuario actualiza la página, el último estado de prohibición de transmisión en vivo se obtendrá de la base de datos y el cuadro de texto se deshabilitará / habilitará. En casos extremos, el usuario envía un mensaje. Cuando el mensaje pasa por el centro de mensajes, verificará si hay una prohibición de transmisión en vivo en la memoria caché. Si la hay, el mensaje no se enviará.
Los pasos interactivos para cancelar la prohibición de todos los usuarios son los mismos que los pasos anteriores, excepto que el tipo de mensaje es cancelar la prohibición de todos los usuarios.

3. Almacenamiento de mensajes

Se agrega una cola a la memoria local del servidor donde se encuentra el centro de mensajes como un búfer, y los registros de chat que pasan por el centro de mensajes se agregan al búfer. Habilite la tarea asincrónica para verificar regularmente si el búfer alcanza el umbral. Después de alcanzar el umbral del búfer, se almacena en lotes en la tabla de registro de chat mongodb.

estructura de la mesa mongodb

Nombre del campo Significado
carné de identidad Clave primaria
zbId Identificación en vivo
msgId Identificación del mensaje
sendUserId Identificación del remitente
recibirUsuarioUsuario ID del destinatario, separado por comas múltiples
hora de envío Tiempo de envío
código Tipo de envío de mensaje
tipo Tipo de mensaje
mensaje Contenido del mensaje
ext Extensión de mensaje
createTime Ahorrar tiempo

4. Autenticación

Verifique el estado de voz del usuario en el centro de mensajes.

5. Expansión
Si necesita admitir la implementación y expansión en caliente, debe resolver los siguientes puntos:
1. El código de administración de sesión del cliente del centro de mensajes debe transformarse en administración de sesión distribuida, como el uso de redis para el almacenamiento, pero cuando el número de conexiones es demasiado grande, la red solicita la transmisión La cantidad de datos también aumentará, inapropiada.

2. El clúster debe resolver el problema del equilibrio de carga. En la actualidad, solo se puede hacer el equilibrio de carga del cliente, y el equilibrio de carga del servidor no se puede lograr como nginx reenvía las solicitudes http.

3. En la actualidad, no existe una solución estándar madura para resolver los problemas anteriores en el mercado, debe hacer algunos intentos combinando algunas ideas dispersas.

La idea del clúster de servicio de mensajes que se encuentra en Internet:
si considera el clúster de sockets desde su propia programación, entonces es difícil. Te cuento un modelo arquitectónico que he usado.

1. Los servicios HTTP están agrupados.

2. Después de habilitar el servidor de socket, accede directamente al servicio HTTP e informa activamente que hay un nuevo servicio de socket. El estado del servicio de socket se almacena en la capa de caché intermedia. El estado de servicio específico se puede detectar mediante un sondeo HTTP. Servicios, desinstalar servicios.

3. El cliente solicita el servicio HTTP. El servicio HTTP analiza el estado de supervivencia y la carga de cada servicio de socket almacenado en él, y luego devuelve la dirección óptima del servicio de socket al cliente.

4. Después de obtener la dirección del servicio de socket de la carga óptima, el cliente se conecta al servicio de socket correspondiente.

5. Para el intercambio de datos entre servicios, se puede agregar un servicio de socket como estación de retransmisión para servicios de socket. Este método no es muy confiable y depende en gran medida del estado de supervivencia del servicio de retransmisión.

6. Los datos de cada servicio de socket deben ser capaces de garantizar el intercambio global y ser utilizados para la comunidad de datos entre los clientes, de modo que el usuario se sienta completamente conectado a un servicio de socket.

El siguiente artículo es la implementación del código para que netty implemente el envío de mensajes: netty implementa el centro de mensajes (2) construye una sala de chat basada en netty

Supongo que te gusta

Origin www.cnblogs.com/powerjiajun/p/12680492.html
Recomendado
Clasificación