Dans tout service Internet moderne, il n'y a que deux fonctions principales:
- Le premier est l'autorisation de l'utilisateur.
- Le second est l'envoi instantané d'un événement du serveur au client.
Le premier point, je pense, n'a pas besoin d'explication.
Le deuxième point est la technologie client-serveur, mais vice versa. Le client ne fait pas périodiquement de demande au serveur - y a-t-il de nouveaux messages. Le serveur, lorsqu'un certain événement se produit, envoie immédiatement le message au client.
Pour une meilleure compréhension, le service n'est pas une certaine sphère dans le vide. Le service peut être représenté comme:
- Un dossier avec des fichiers dans le cloud. Les informations sur la modification, l'ajout et la suppression sont envoyées à d'autres utilisateurs ou à l'utilisateur actuel, mais à d'autres appareils.
- Un programme informatique pour lire les journaux du serveur, lorsque des enregistrements «d'erreur» apparaissent, envoyer le contenu de l'enregistrement à l'utilisateur sur un téléphone mobile.
- Judas vidéo (caméra) prenant des photos lorsque vous vous approchez de la porte de l'appartement.
- Un service recevant la télémétrie d'une application android-auto.
- Un service similaire au paragraphe précédent, qui vous permet de savoir si un enfant a atteint l'école ou est rentré de l'école.
La liste peut être étendue indéfiniment; à titre d'exemple, seuls les cas d'utilisation les plus connus sont donnés.
Presque tous les exemples de services peuvent être présentés sous la forme d'un "messager". Une partie des exemples a été décrite exactement de cette façon; j'ai vu des articles sur la façon de connecter l'appareil photo et d'envoyer des photos à un célèbre messager.
Il n'y a pas si longtemps, il y avait un article selon lequel des étrangers regardaient le service de caméra dans les yeux de la porte, au lieu de l'intelligence artificielle. Je ne me concentrerai pas sur les services gratuits des grandes "bonnes" sociétés. Comme on dit dans le célèbre proverbe «Le fromage gratuit arrive dans une souricière» et guidé par un autre proverbe «Votre chemise est plus proche de votre corps», votre «service» est meilleur.
Le code de script du serveur est ouvert et gratuit
J'ai choisi node.js socket.io postgreSQL pour l'implémentation, j'ai implémenté la première version il y a plus de deux ans, et le service était étroitement lié à 1c
https://infostart.ru/public/545047/ , ils n'avaient encore annoncé de serveur d'interaction nulle part. Mais il y a longtemps, à l'heure actuelle, la partie serveur n'est en aucun cas connectée au programme mentionné, la partie client peut être intégrée en tant que traitement externe ou extension.
Le nom choisi est significatif - «push0k». La première partie est tirée de l'expression "push message", le deuxième anglais bien connu sous forme abrégée, mais il est écrit par zéro pour le plus significatif.
Dans ce cas, ce n'est pas un «fromage gratuit dans une souricière», car il nécessite un ordinateur Windows, Linux, macOS (serveur) pour fonctionner via Internet, vous avez besoin d'une adresse IP externe, éventuellement transmise. De préférence le nom de domaine associé à l'adresse IP externe. En outre, il est souhaitable, mais pas nécessaire, pas un certificat auto-signé associé à un nom de domaine.
Il n'y a aucune configuration matérielle en tant que telle, il peut fonctionner sur le NAS domestique, où il y a docker. Docker dans nas signifie architecture x86-64, et postgreSQL ne peut pas être installé dans un tel nas sans docker. Une compréhension précise du nombre de clients qu'un tel serveur peut prendre en charge dépend des tâches - la logique du service et le trafic transmis entre les clients.
Description du serveur:
Le serveur utilise des modules supplémentaires:
- socket.io - le module ajoute un protocole websocket avec une tonne d'ext. opportunités.
- node-postgres - module de communication avec le serveur de base de données postgreSQL.
- pm2 est un module permettant de démarrer plusieurs processus serveur avec un équilibreur de charge.
Fichiers serveur:
- starter.js - service http (s), vous pouvez dire le panneau d'administration du serveur. Grâce à ce service, les paramètres sont modifiés et les processus du serveur Websocket principal sont lancés.
- push0k.js est le serveur websocket principal.
- starter_cfg.js - paramètres de script d'administration du serveur. Connexion à postgreSQL et fichiers pour la connexion https. Les fichiers pour les connexions https, ainsi que le nom de domaine, peuvent différer du serveur principal, pour plus de sécurité. Il est modifié manuellement au premier démarrage.
- config.js - les paramètres de base de l'ensemble du serveur.
- package.js - modules auteur de la description du fichier nécessaires au travail.
- push0kStructure.sql - description du fichier de la base de données postgreSQL pour l'initialisation initiale, une base de données vide.
Installation:
1. Initialement, vous devez installer node.js
nodejs.org/en/download2. PostgreSQL doit également être installé sur l'ordinateur du réseau local ou le même
postgrespro.ru/products/downloadSur le serveur postgreSQL, il est nécessaire d'exécuter le fichier «push0kStructure.sql» ou presque toutes les requêtes de ce fichier pour créer une base de données avec les tables nécessaires.
3. Téléchargez les cinq premiers fichiers du serveur, à l'exception de push0kStructure.sql, dans n'importe quel répertoire d'ordinateur.
4. Dans n'importe quel éditeur de texte, modifiez le fichier "starter_cfg.js". Il est important de spécifier les paramètres de connexion au serveur postgreSQL et de définir le port de connexion à la partie administrative du serveur push0k.
5. Démarrez le terminal (console) et utilisez la commande «cd / chemin / votre / répertoire /» pour accéder au répertoire de fichiers du serveur. Le chemin spécifié dans la commande de terminal doit être à partir du point 3.
6. Exécutez la commande dans le terminal «npm install» pour installer des modules supplémentaires.
Exécutez la commande dans le terminal «node starter.js» pour démarrer le service d'administration.
7. Téléchargez et installez le programme d'administration push0k. Dans "push0k admin", les paramètres de base du websocket, le port du serveur, le nombre de processus et bien d'autres sont configurés. Vous pouvez contrôler le démarrage et l'arrêt des processus serveur, créer et gérer les utilisateurs et leurs salles (groupes).
Application d'administration Push0k

L'application se fait sur électron en utilisant vue.js. À l'intérieur, une sorte de système de fenêtres est implémenté, de petites boîtes de dialogue modales peuvent être glissées et déposées comme des fenêtres, les titres de fenêtres pour les fenêtres sont similaires à Windows 10, pour Mac OS comme dans les dernières versions, mais jusqu'à présent sans prendre en compte le thème sombre. Pour linux, je vais compiler plus tard, c'est un peu plus compliqué avec les en-têtes de dialogue, je pense que ce sera comme dans ubuntu et, si ce n'est pas ubuntu, alors gagner 10 styles. La consommation de mémoire dans Win 10 et Mac OS de plus de 150 mégaoctets n'a pas vu.
Dans les versions précédentes, il n'était pas possible d'ajouter de l'animation, faisait un peu sans fanatisme. Les boîtes de dialogue décrites précédemment - les fenêtres apparaissent à partir du centre de la fenêtre de l'application, augmentant progressivement, lorsqu'elles sont fermées, volent vers le centre, diminuant. De plus, les pressions sur les boutons et les champs obligatoires sont animés.

Lors de la mise en œuvre, il y avait un grand désir de faire un thème sombre, mais comme il n'y avait pas encore de thème clair, je devais me contenter du panneau de boutons à droite. Sous Mac OS, cette seule partie sombre a un effet de dynamisme, c'est-à-dire qu'elle est partiellement transparente, semblable à la plupart des fenêtres de l'interface standard. Malheureusement, sous Windows, un effet similaire appelé fluent design n'a pas pu être effectué car il n'y a pas de fonctionnalité similaire dans Windows pour électron.
Comme mentionné précédemment, le contrôle utilise les protocoles http et ws (websocket). Il est possible d'utiliser des connexions https et wss sécurisées. Avec des connexions sécurisées, vous pouvez voir les données des certificats utilisés. De la même manière que pour les navigateurs, l'icône «Lock» est utilisée - la connexion est sécurisée, «Open lock» - la connexion n'est pas sûre. Et sans icônes, respectivement - une connexion sécurisée n'est pas utilisée.

Logique générale
Je n'ai jamais vu une telle application. Pendant le développement, j'ai été guidé par le fait que je serais moi-même intéressé par le suivi et les paramètres à voir dans les statistiques.
Par exemple, dans la table de connexion pour chaque connexion, il y a des données «heure de connexion», «heure d'autorisation», «heure de synchronisation». Le premier vous permet de comprendre à quelle vitesse la connexion «ws: //» ou le «wss: //» protégé est établi. La seconde - après la connexion, un message avec les données d'autorisation est envoyé séparément, pendant l'autorisation, une demande de vérification de l'utilisateur est effectuée et une vérification du hachage du mot de passe est unique pour chaque connexion. Troisièmement, il est temps de recevoir de nouveaux messages et des données de référence nouvelles ou mises à jour. De plus, les versions de node.js, socket.io et d'autres données décrites sont généralement enregistrées, ce qui permet de comprendre comment la mise à jour de node.js ou du module a affecté séparément la vitesse, ou un raffinement du serveur aurait pu affecter.

Dans l'exemple ci-dessus, seule une petite partie de ces données est décrite. De plus, dans un tableau séparé, le temps, la taille et la vitesse des Mo / s sont enregistrés. Téléchargez la synchronisation des données. Le même tableau stocke les données de téléchargement des fichiers joints sur le serveur et de téléchargement de ces données depuis le serveur.
Le temps de calcul de la vitesse est calculé sur le client ou le serveur, selon la situation. Il est impossible d'utiliser l'heure du serveur et du client car elle ne peut pas être parfaitement synchronisée. Cela impose un petit retard de taille de ping (confirmation de livraison) entre le client et le serveur. Lors du téléchargement ou du téléchargement de fichiers volumineux, le décalage décrit n'est pas significatif.
Dans le tableau de connexion, vous pouvez voir la connexion fermée avec les données «octet transmis», «octet reçu» et «taille» des données de synchronisation plus que «l'octet transmis». Lors de la synchronisation des données, la compression automatique est utilisée par socket.io, lors du téléchargement ou du téléchargement de pièces jointes, la compression automatique est désactivée, car la compression déjà compressée a souvent un effet négatif sur la vitesse.
Comme écrit au début de l'article, il n'a jamais été question de créer un service commun et d'y connecter autant d'utilisateurs que possible. Mais il était toujours intéressant de savoir combien il peut y avoir théoriquement d'utilisateurs et quel type de charge le serveur supportera.
Pour ce faire, j'ai fait un test simple: en ligne aux clients d'une certaine pièce (groupe), un message est envoyé avec des paramètres de test (dans les paramètres il n'y a qu'un seul paramètre principal - le nombre de messages), que chaque client enverra à d'autres clients en ligne. Après la distribution de test, la durée totale de tous les messages, notifications, entrées dans les tables postgresql, le nombre de tous les messages, notifications et entrées sont calculés et, par conséquent, la vitesse est calculée, y compris le total de toutes les opérations sur le serveur.
Exemple de la capture d'écran:
C'est parfois le plus surprenant, seulement 10 000 messages et 390 000 gestes,
envoi de 50 000 messages: Processus serveur: 4 Utilisateurs: 3
Total des messages reçus 10 000 * 3 = 30 000
Transfert vers d'autres processus serveur 30 000 * Processus serveur: 4 - 1 = 90 000
Envoyé aux destinataires 30000 * Utilisateurs: 3 - 1 = 60000
Les messages sont écrits dans la table postgreSQL 30 000
90 000 notifications de livraison reçues
Enregistré dans le tableau des notifications de livraison postgreSQL 90 000
Toutes opérations 390 000Logique des données dans push0k admin
A chaque connexion, toutes les données de référence sont obtenues: utilisateurs, salles, appareils, bases de données, ainsi que les 300 dernières entrées du «journal-statistique»: Connexions, Synchronisation des données, Transmission des pièces jointes, Messages, Journal.
Les messages répètent pratiquement le tableau postgresql et n'ont pas de filtres, de paramètres et un formulaire où vous pouvez voir le message complètement. La logique de la table est le débogage, il est possible de voir rapidement pendant le développement si le message a atteint la table ou non.

Les tableaux «Utilisateurs», «Salles (groupes)», «Connexions» et «Journal» sont mis à jour automatiquement. Pour le reste des données, la mise à jour en ligne est inutile.
L'application d'administration push0k peut être téléchargée ici:
Windows:
installation de push0kadmin 19.1.11.exeMac OS:
push0kadmin-19.1.11.dmgC'est gratuit, mais contrairement au serveur, je ne prévois pas encore d'ouvrir le code source.
Dans le prochain article, je décrirai la partie client du client push0k desctop, ainsi qu'un petit exemple, du code et comment se connecter, se connecter et recevoir des données du serveur.
Pour les versions précédentes mentionnées précédemment, il y avait également un client Android, vivant immortellement en arrière-plan sur les 7e et 8e versions d'Android. Mais pour l'instant, je pense que je n'ai pas pris de retard depuis longtemps. Plus tard, je pense qu'il y aura un troisième article avec un client Android, et là vous regardez et iOS n'est pas loin.