Servidor de mensajes push

En cualquier servicio moderno de Internet, solo hay dos funciones principales:

  • El primero es la autorizaci贸n del usuario.
  • El segundo es el env铆o instant谩neo de un evento desde el servidor al cliente.

El primer punto, creo, no necesita una explicaci贸n.

El segundo punto es la tecnolog铆a cliente-servidor, pero viceversa. El cliente no realiza peri贸dicamente una solicitud al servidor. 驴Hay alg煤n mensaje nuevo? El servidor, cuando ocurre un determinado evento, env铆a el mensaje inmediatamente al cliente.

Para una mejor comprensi贸n, el servicio no es un cierto esf茅rico en el vac铆o. El servicio se puede representar como:

  • Una carpeta con archivos en la nube. La informaci贸n sobre c贸mo cambiar, agregar y eliminar se env铆a a otros usuarios o al usuario actual, pero a otros dispositivos.
  • Un programa de computadora para leer los registros del servidor, cuando aparecen registros de "error", enviando el contenido del registro al usuario en un tel茅fono m贸vil.
  • Mirilla de video (c谩mara) tomando fotos cuando se mueve cerca de la puerta del apartamento.
  • Un servicio que recibe telemetr铆a de una aplicaci贸n Android-Auto.
  • Un servicio similar al p谩rrafo anterior, que le permite saber si un ni帽o ha llegado a la escuela o ha regresado de la escuela.

La lista se puede expandir indefinidamente; como ejemplo, solo se dan los casos de uso m谩s conocidos.

Casi todos los ejemplos de servicios se pueden presentar en forma de "mensajero". Parte de los ejemplos se describieron exactamente de esta manera; vi art铆culos sobre c贸mo conectar la c谩mara y enviar im谩genes a un famoso mensajero.

No hace mucho tiempo, hab铆a un art铆culo en el que los extra帽os observaban el servicio de la c谩mara en los ojos de la puerta, en lugar de la inteligencia artificial. No me enfocar茅 en servicios gratuitos de grandes corporaciones "buenas". Como dicen en el famoso proverbio "El queso gratis sucede en una trampa para ratones" y guiado por otro proverbio "Tu camisa est谩 m谩s cerca de tu cuerpo", tu "servicio" es mejor.

El c贸digo de script del servidor es abierto y gratuito



Eleg铆 node.js socket.io postgreSQL para la implementaci贸n, implement茅 la primera versi贸n hace m谩s de dos a帽os, y el servicio estaba estrechamente relacionado con 1c https://infostart.ru/public/545047/ , todav铆a no hab铆an anunciado un servidor de interacci贸n en ninguna parte. Pero fue hace mucho tiempo, en este momento, la parte del servidor no est谩 conectada de ninguna manera con el programa mencionado, la parte del cliente puede integrarse como procesamiento externo o extensi贸n.

El nombre elegido es significativo: "push0k". La primera parte est谩 tomada de la frase "mensaje push", el segundo ingl茅s bien conocido en forma abreviada, pero est谩 escrito en cero para el m谩s significativo.

En este caso, esto no es un "queso gratis en una trampa para ratones", ya que requiere una computadora Windows, Linux, MacOS (servidor) para funcionar a trav茅s de Internet, necesita una direcci贸n IP externa, posiblemente reenviada. Preferiblemente el nombre de dominio asociado con la direcci贸n IP externa. Adem谩s, es deseable, pero no necesario, no un certificado autofirmado asociado con un nombre de dominio.

No hay requisitos de hardware como tales, puede funcionar en el hogar nas, donde hay docker. Docker en nas significa arquitectura x86-64, y postgreSQL no se puede instalar en tales nas sin docker. Una comprensi贸n precisa de cu谩ntos clientes puede soportar dicho servidor depende de las tareas: la l贸gica del servicio y el tr谩fico transmitido entre los clientes.

Descripci贸n del servidor:


El servidor usa m贸dulos adicionales:

  • socket.io: el m贸dulo agrega un protocolo websocket con una tonelada de ext. oportunidades
  • node-postgres - m贸dulo para la comunicaci贸n con el servidor de base de datos postgreSQL.
  • pm2 es un m贸dulo para iniciar varios procesos del servidor con un equilibrador de carga.

Archivos del servidor:


  • starter.js - servicio http (s), puede decir el panel de administraci贸n del servidor. A trav茅s de este servicio, se cambia la configuraci贸n y se inician los procesos del servidor websocket principal.
  • push0k.js es el servidor websocket principal.
  • starter_cfg.js: configuraci贸n del script administrativo del servidor. Conexi贸n a postgreSQL y archivos para conexi贸n https. Los archivos para las conexiones https, as铆 como el nombre de dominio, pueden diferir del servidor principal, para mayor seguridad. Se cambia manualmente en el primer inicio.
  • config.js: la configuraci贸n b谩sica de todo el servidor.
  • package.js: m贸dulos de autor de versi贸n de descripci贸n de archivo necesarios para el trabajo.
  • push0kStructure.sql: descripci贸n del archivo de la base de datos postgreSQL para la inicializaci贸n inicial, una base de datos vac铆a.

Instalaci贸n:


1. Inicialmente, debe instalar node.js nodejs.org/en/download

2. PostgreSQL tambi茅n debe instalarse en la computadora de la red local o en el mismo postgrespro.ru/products/download

En el servidor postgreSQL, es necesario ejecutar el archivo "push0kStructure.sql" o casi todas las consultas de este archivo para crear una base de datos con las tablas necesarias.

3. Descargue los primeros cinco archivos del servidor, excepto push0kStructure.sql, en cualquier directorio de la computadora.

4. En cualquier editor de texto, edite el archivo "starter_cfg.js". Es importante especificar los par谩metros para conectarse al servidor postgreSQL y establecer el puerto para conectarse a la parte administrativa del servidor push0k.

5. Inicie el terminal (consola) y use el comando "cd / ruta / su / directorio /" para ir al directorio de archivos del servidor. La ruta especificada en el comando del terminal debe ser desde el punto 3.

6. Ejecute el comando en el terminal "npm install" para instalar m贸dulos adicionales.
Ejecute el comando en el terminal "node starter.js" para iniciar el servicio de administraci贸n.

7. Descargue e instale el programa de administraci贸n push0k. En "push0k admin" se configuran los par谩metros b谩sicos del websocket, el puerto del servidor, el n煤mero de procesos y muchos otros. Puede controlar el inicio y la detenci贸n de los procesos del servidor, crear y administrar usuarios y sus salas (grupos).

Aplicaci贸n de administraci贸n Push0k




La aplicaci贸n se realiza en electr贸n usando vue.js. En el interior, se implementa un tipo de sistema de ventanas, los peque帽os cuadros de di谩logo modales se pueden arrastrar y soltar como ventanas, los t铆tulos de ventanas para Windows se hacen similares a Windows 10, para Mac OS como en las 煤ltimas versiones, pero hasta ahora sin tener en cuenta el tema oscuro. Para Linux, compilar茅 m谩s tarde, es un poco m谩s complicado con los t铆tulos de los di谩logos, creo que ser谩 como en ubuntu y, si no es ubuntu, ganar茅 10 estilos. El consumo de memoria en win 10 y Mac OS m谩s de 150 megabytes no se vio.

En versiones anteriores no era posible agregar animaci贸n, lo hac铆a un poco sin fanatismo. Los cuadros de di谩logo descritos anteriormente: las ventanas aparecen desde el centro de la ventana de la aplicaci贸n, aumentando gradualmente, cuando est谩n cerradas, vuelan hacia el centro, disminuyendo. Adem谩s, las pulsaciones de botones y los campos obligatorios est谩n animados.



Durante la implementaci贸n, hab铆a un gran deseo de crear un tema oscuro, pero como todav铆a no hab铆a un tema claro, tuve que contentarme solo con el panel de botones de la derecha. En Mac OS, esta 煤nica parte oscura tiene un efecto de vitalidad, es decir, es parcialmente transparente, similar a la mayor铆a de las ventanas de la interfaz est谩ndar. Desafortunadamente, en Windows, un efecto similar llamado dise帽o fluido no se pudo hacer porque no hay una funcionalidad similar en Windows para el electr贸n.

Como se mencion贸 anteriormente, el control utiliza los protocolos http y ws (websocket). Es posible utilizar conexiones seguras https y wss. Con conexiones seguras, puede ver los datos de los certificados utilizados. De manera similar a los navegadores, se utiliza el 铆cono "Bloquear": la conexi贸n es segura, "Bloqueo abierto": la conexi贸n no es segura. Y sin iconos, respectivamente, no se utiliza una conexi贸n segura.



L贸gica general


Nunca he visto tal aplicaci贸n. Durante el desarrollo, me gui茅 por el hecho de que yo mismo estar铆a interesado en el monitoreo y qu茅 par谩metros ver en las estad铆sticas.

Por ejemplo, en la tabla de conexi贸n para cada conexi贸n hay datos "tiempo de conexi贸n", "tiempo de autorizaci贸n", "tiempo de sincronizaci贸n". El primero le permite comprender qu茅 tan r谩pido se establece la conexi贸n "ws: //" o el "wss: //" protegido. El segundo: despu茅s de la conexi贸n, se env铆a un mensaje con datos de autorizaci贸n por separado, durante la autorizaci贸n, se realiza una solicitud de verificaci贸n del usuario y una comprobaci贸n de hash de contrase帽a es 煤nica para cada conexi贸n. En tercer lugar, es el momento de recibir nuevos mensajes y datos de referencia nuevos o actualizados. Adem谩s, las versiones de node.js, socket.io y otros datos descritos generalmente se guardan, lo que permite comprender c贸mo la actualizaci贸n de node.js o el m贸dulo afectaron por separado la velocidad, o podr铆a haber afectado alg煤n refinamiento del servidor.



En el ejemplo anterior, solo se describe una peque帽a parte de dichos datos. Adem谩s, en una tabla separada, se guardan el tiempo, el tama帽o y la velocidad de MB / s. Descargar sincronizaci贸n de datos. La misma tabla almacena los datos de la descarga de archivos adjuntos al servidor y la descarga de estos datos del servidor.

El tiempo para calcular la velocidad se calcula en el cliente o servidor, seg煤n la situaci贸n. Es imposible usar el tiempo tanto del servidor como del cliente ya que no se puede sincronizar perfectamente. Esto impone un peque帽o retraso de tama帽o de ping (confirmaci贸n de entrega) entre el cliente y el servidor. Al cargar o descargar archivos grandes, el retraso descrito no es significativo.

En la tabla de conexi贸n, puede ver la conexi贸n cerrada con los datos "byte transmitido", "byte recibido" y "tama帽o" de los datos de sincronizaci贸n m谩s que el "byte transmitido". Al sincronizar datos, se utiliza la compresi贸n autom谩tica de socket.io, al descargar o descargar archivos adjuntos, la compresi贸n autom谩tica se desactiva, ya que a menudo la compresi贸n ya comprimida afecta negativamente la velocidad.

Como se escribi贸 al principio del art铆culo, nunca fue un objetivo crear un servicio com煤n y conectar tantos usuarios como sea posible. Pero siempre fue interesante cu谩ntos te贸ricamente puede haber usuarios y qu茅 tipo de carga soportar谩 el servidor.

Para hacer esto, hice una prueba simple: en l铆nea a los clientes de una determinada sala (grupo), se env铆a un mensaje con los par谩metros de prueba (en los par谩metros solo hay un par谩metro principal: el n煤mero de mensajes), que cada cliente enviar谩 a otros clientes en l铆nea. Despu茅s de la distribuci贸n de prueba, se calcula el tiempo total de todos los mensajes, notificaciones, entradas en las tablas postgresql, se calcula el n煤mero de todos los mensajes, notificaciones y entradas y, en consecuencia, se calcula la velocidad, incluido el total de todas las operaciones en el servidor.



Ejemplo de la captura de pantalla:

A veces es m谩s sorprendente, solo 10,000 mensajes y 390,000 gestos,
enviando 50,000 mensajes: Procesos del servidor: 4 Usuarios: 3
Total de mensajes recibidos 10,000 * 3 = 30,000
Reenv铆o a otros procesos del servidor 30,000 * Procesos del servidor: 4 - 1 = 90,000
Enviado a destinatarios 30,000 * Usuarios: 3 - 1 = 60,000
Los mensajes se escriben en la tabla postgreSQL 30 000
90,000 notificaciones de entrega recibidas
Grabado en la tabla de notificaciones de entrega postgreSQL 90,000
Todas las operaciones 390,000

L贸gica de datos en administrador push0k


Con cada conexi贸n, se obtienen todos los datos de referencia: usuarios, salas, dispositivos, bases de datos, as铆 como las 煤ltimas 300 entradas del "diario estad铆stico": Conexiones, Sincronizaci贸n de datos, Reenv铆o de archivos adjuntos, Mensajes, Diario.

Los mensajes pr谩cticamente repiten la tabla postgresql y no tienen filtros, configuraciones y un formulario donde pueda ver el mensaje por completo. La l贸gica de la tabla es la depuraci贸n, es posible ver r谩pidamente durante el desarrollo si el mensaje ha llegado a la tabla o no.



Las tablas "Usuarios", "Salas (grupos)", "Conexiones" y "Diario" se actualizan autom谩ticamente. Para el resto de los datos, no tiene sentido actualizar en l铆nea.

La aplicaci贸n de administraci贸n push0k se puede descargar aqu铆:

Windows: push0kadmin Setup 19.1.11.exe
Mac OS: push0kadmin-19.1.11.dmg

Es gratis, pero a diferencia del servidor, todav铆a no planeo abrir el c贸digo fuente.

En el pr贸ximo art铆culo describir茅 la parte del cliente del cliente Desctop push0k, as铆 como un peque帽o ejemplo, c贸digo y c贸mo conectarse, iniciar sesi贸n y recibir datos del servidor.

Para las versiones anteriores mencionadas anteriormente, tambi茅n hab铆a un cliente de Android, que viv铆a inmortalmente en segundo plano en las versiones 7 y 8 de Android. Pero por ahora, creo que no me retras茅 por mucho tiempo. M谩s tarde, creo que habr谩 un tercer art铆culo con un cliente de Android, y all铆 se ve y iOS no est谩 lejos.

Source: https://habr.com/ru/post/438388/


All Articles