Em qualquer serviço moderno da Internet, existem apenas duas funções principais:
- O primeiro é a autorização do usuário.
- O segundo é o envio instantâneo de um evento do servidor para o cliente.
O primeiro ponto, acho, não precisa de explicação.
O segundo ponto é a tecnologia cliente-servidor, mas vice-versa. O cliente não faz periodicamente uma solicitação ao servidor - há novas mensagens. O servidor, quando ocorre um determinado evento, envia a mensagem imediatamente para o cliente.
Para uma melhor compreensão, o serviço não é um determinado esférico no vácuo. O serviço pode ser representado como:
- Uma pasta com arquivos na nuvem. Informações sobre alteração, adição e exclusão são enviadas para outros usuários ou o usuário atual, mas para outros dispositivos.
- Um programa de computador para ler os logs do servidor, quando os registros de "erro" são exibidos, enviando o conteúdo do registro para o usuário em um telefone móvel.
- Olho mágico de vídeo (câmera) tirando fotos quando se aproxima da porta do apartamento.
- Um serviço que recebe telemetria de um aplicativo android-auto.
- Um serviço semelhante ao parágrafo anterior, que permite descobrir se uma criança chegou à escola ou chegou da escola.
A lista pode ser expandida indefinidamente; como exemplo, apenas os casos de uso mais conhecidos são fornecidos.
Quase todos os exemplos de serviços podem ser apresentados na forma de um "mensageiro". Parte dos exemplos foi descrita exatamente dessa maneira: vi artigos sobre como conectar a câmera e enviar fotos para um mensageiro famoso.
Não faz muito tempo, havia um artigo em que pessoas de fora observavam a câmera atendendo aos olhos da porta, em vez de inteligência artificial. Não vou me concentrar em serviços gratuitos de grandes empresas "boas". Como se costuma dizer no famoso provérbio "Queijo grátis acontece na ratoeira" e guiado por outro provérbio "Sua camisa está mais perto do seu corpo", seu "serviço" é melhor.
O código de script do servidor é aberto e gratuito
Eu escolhi o node.js socket.io postgreSQL para a implementação, implementei a primeira versão há mais de dois anos e o serviço estava intimamente conectado ao 1c
https://infostart.ru/public/545047/ , eles ainda não haviam anunciado um servidor de interação em lugar algum. Mas já faz muito tempo, no momento, a parte do servidor não está de forma alguma conectada ao programa mencionado, a parte do cliente pode ser integrada como extensão ou processamento externo.
O nome escolhido é significativo - "push0k". A primeira parte é retirada da frase “push message”, o segundo inglês bem conhecido, de forma abreviada, mas é escrita com zero para o mais significativo.
Nesse caso, este não é um “queijo grátis em uma ratoeira”, pois exige que um computador Windows, Linux, MacOS (servidor) funcione via Internet, você precisa de um endereço IP externo, possivelmente encaminhado. De preferência, o nome de domínio associado ao endereço IP externo. Além disso, é desejável, mas não necessário, não um certificado autoassinado associado a um nome de domínio.
Não há requisitos de hardware, como tal, ele pode funcionar em home NAS, onde há docker. Docker no nas significa arquitetura x86-64, e o postgreSQL não pode ser instalado nesse nas sem o docker. Um entendimento preciso de quantos clientes esse servidor pode suportar depende das tarefas - a lógica do serviço e o tráfego transmitido entre os clientes.
Descrição do servidor:
O servidor usa módulos adicionais:
- socket.io - o módulo adiciona um protocolo websocket com uma tonelada de ext. oportunidades.
- node-postgres - módulo para comunicação com o servidor de banco de dados postgreSQL.
- O pm2 é um módulo para iniciar vários processos do servidor com um balanceador de carga.
Arquivos do servidor:
- starter.js - serviço http (s), você pode dizer o painel de administração do servidor. Por meio desse serviço, as configurações são alteradas e os processos do servidor websocket principal são iniciados.
- push0k.js é o servidor principal do websocket.
- starter_cfg.js - configurações de script administrativo do servidor. Conexão ao postgreSQL e arquivos para conexão https. Os arquivos para conexões https, bem como o nome do domínio, podem diferir do servidor principal, para maior segurança. É alterado manualmente no primeiro início.
- config.js - as configurações básicas de todo o servidor.
- package.js - módulos de autor da versão de descrição do arquivo necessários para o trabalho.
- push0kStructure.sql - descrição do arquivo do banco de dados postgreSQL para inicialização, um banco de dados vazio.
Instalação:
1. Inicialmente, você precisa instalar o node.js
nodejs.org/en/download2. O PostgreSQL também deve ser instalado no computador da rede local ou no mesmo
postgrespro.ru/products/downloadNo servidor postgreSQL, é necessário executar o arquivo "push0kStructure.sql" ou quase todas as consultas desse arquivo para criar um banco de dados com as tabelas necessárias.
3. Faça o download dos cinco primeiros arquivos do servidor, exceto push0kStructure.sql, em qualquer diretório do computador.
4. Em qualquer editor de texto, edite o arquivo "starter_cfg.js". É importante especificar os parâmetros para conectar-se ao servidor postgreSQL e definir a porta para conectar-se à parte administrativa do servidor push0k.
5. Inicie o terminal (console) e use o comando “cd / path / your / directory /” para ir para o diretório de arquivos do servidor. O caminho especificado no comando do terminal deve ser do ponto 3.
6. Execute o comando no terminal “npm install” para instalar módulos adicionais.
Execute o comando no terminal "node starter.js" para iniciar o serviço de administração.
7. Faça o download e instale o programa de administração push0k. No websocket "push0k admin", parâmetros básicos, porta do servidor, número de processos e muitos outros são configurados. Você pode controlar o início e o fim dos processos do servidor, criar e gerenciar usuários e suas salas (grupos).
Aplicativo de administração Push0k

A aplicação é feita no elétron usando vue.js. No interior, um tipo de sistema de janelas é implementado, pequenos diálogos modais podem ser arrastados e soltos como janelas, os títulos das janelas são semelhantes aos do Windows 10, para o Mac OS como nas versões recentes, mas até agora sem levar em conta o tema sombrio. Para o linux, eu vou compilar mais tarde, é um pouco mais complicado com os títulos dos diálogos, acho que será como no ubuntu e, se não no ubuntu, ganhará o estilo 10. O consumo de memória no win 10 e no Mac OS com mais de 150 megabytes não viu.
Nas versões anteriores não era possível adicionar animação, fazia um pouco sem fanatismo. As caixas de diálogo descritas anteriormente - janelas aparecem no centro da janela do aplicativo, aumentando gradualmente, quando fechadas, voam para o centro, diminuindo. Além disso, os botões pressionados e os campos obrigatórios são animados.

Durante a implementação, havia um grande desejo de criar um tema sombrio, mas como ainda não havia um tema claro, eu precisava me contentar apenas com o painel de botões à direita. No Mac OS, essa única parte escura tem um efeito vibrante, ou seja, é parcialmente transparente, semelhante à maioria das janelas da interface padrão. Infelizmente, no Windows, um efeito semelhante chamado design fluente não pôde ser feito porque não há funcionalidade semelhante no Windows para elétrons.
Como mencionado anteriormente, o controle usa os protocolos http e ws (websocket). É possível usar conexões https e wss seguras. Com conexões seguras, você pode ver os dados dos certificados usados. Da mesma forma que nos navegadores, o ícone "Bloquear" é usado - a conexão é segura, "Bloqueio aberto" - a conexão é insegura. E sem ícones, respectivamente - uma conexão segura não é usada.

Lógica geral
Eu nunca vi essa aplicação. Durante o desenvolvimento, fui guiado pelo fato de que eu mesmo estaria interessado em monitorar e quais parâmetros ver nas estatísticas.
Por exemplo, na tabela de conexões para cada conexão, existem dados "tempo de conexão", "tempo de autorização", "tempo de sincronização". O primeiro permite entender com que rapidez a conexão "ws: //" ou o "wss: //" protegido é estabelecido. A segunda - após a conexão, uma mensagem com dados de autorização é enviada separadamente, durante a autorização, uma solicitação de verificação do usuário é executada e uma verificação de hash da senha é exclusiva para cada conexão. Terceiro, é o momento de receber novas mensagens e dados de referência novos ou atualizados. Além disso, as versões do node.js, socket.io e outros dados descritos são geralmente salvos, o que possibilita entender como a atualização do node.js ou do módulo afetou separadamente a velocidade ou algum refinamento do servidor poderia ter afetado.

No exemplo acima, apenas uma pequena parte desses dados é descrita. Além disso, em uma tabela separada, o tempo, o tamanho e a velocidade de MB / s são salvos. Baixe a sincronização de dados. A mesma tabela armazena os dados do download de arquivos de anexo no servidor e do download desses dados do servidor.
O tempo para calcular a velocidade é calculado no cliente ou servidor, dependendo da situação. É impossível usar o tempo do servidor e do cliente, pois ele não pode ser perfeitamente sincronizado. Isso impõe um pequeno atraso no tamanho do ping (confirmação de entrega) entre o cliente e o servidor. Ao carregar ou baixar arquivos grandes, o atraso descrito não é significativo.
Na tabela de conexão, você pode ver a conexão fechada com os dados “byte transmitido”, “byte recebido” e “tamanho” dos dados de sincronização mais do que o “byte transmitido”. Ao sincronizar dados, a compactação automática do socket.io é usada; ao fazer o download ou o download de anexos, a compactação automática é desabilitada, pois a compactação já compactada já afeta negativamente a velocidade.
Como foi escrito no começo do artigo, nunca foi um objetivo criar um serviço comum e conectar o maior número possível de usuários. Mas sempre foi interessante quantas teoricamente existem usuários e que tipo de carga o servidor suportará.
Para fazer isso, fiz um teste simples: Online para clientes de uma determinada sala (grupo), uma mensagem é enviada com parâmetros de teste (nos parâmetros existe apenas um parâmetro principal - o número de mensagens), que cada cliente envia para outros clientes online. Após a distribuição do teste, o tempo total de todas as mensagens, notificações, entradas nas tabelas postgresql, o número de todas as mensagens, notificações e entradas são calculados e, consequentemente, a velocidade é calculada, incluindo o total de todas as operações no servidor.
Exemplo da captura de tela:
Às vezes, é mais surpreendente: apenas 10.000 mensagens e 390.000 gestos,
enviando 50.000 mensagens: Processos do servidor: 4 Usuários: 3
Total de mensagens recebidas 10.000 * 3 = 30.000
Encaminhamento para outros processos do servidor 30.000 * Processos do servidor: 4 - 1 = 90.000
Enviado aos destinatários 30.000 * Usuários: 3 - 1 = 60.000
As mensagens são gravadas na tabela 30 000 do postgreSQL
90.000 notificações de entrega recebidas
Registrado na tabela de notificações de entrega do postgreSQL 90.000
Todas as operações 390.000Lógica de dados no push0k admin
Com cada conexão, todos os dados de referência são obtidos: usuários, salas, dispositivos, bancos de dados, bem como as últimas 300 entradas do “diário estatístico”: Conexões, Sincronização de Dados, Encaminhamento de anexos, Mensagens, Diário.
As mensagens praticamente repetem a tabela postgresql e não possuem filtros, configurações e um formulário onde você pode ver a mensagem completamente. A lógica da tabela está depurando, é possível ver rapidamente durante o desenvolvimento se a mensagem chegou à tabela ou não.

As tabelas “Usuários”, “Salas (grupos)”, “Conexões” e “Diário” são atualizadas automaticamente. Para o restante dos dados, não há sentido em atualizar online.
O aplicativo de administração push0k pode ser baixado aqui:
Windows:
push0kadmin Setup 19.1.11.exeMac OS:
push0kadmin-19.1.11.dmgÉ gratuito, mas diferente do servidor, ainda não pretendo abrir o código fonte.
No próximo artigo, descreverei a parte do cliente do push0k desctop, bem como um pequeno exemplo de código e como conectar, efetuar login e receber dados do servidor.
Para as versões anteriores mencionadas anteriormente, havia também um cliente Android, vivendo imortalmente em segundo plano nas 7ª e 8ª versões do Android. Mas, por enquanto, acho que não fiquei para trás por muito tempo. Mais tarde, acho que haverá um terceiro artigo com um cliente Android, e aí você olha e o iOS não está longe.