Essência
Eu tenho um aplicativo que é executado em uma arquitetura baseada em microsserviço (no Kubernetes). Toda a comunicação de / para fora do aplicativo ocorre através de um API Gateway .
O que significa apenas que solicitações do meu front-end não vão diretamente para os serviços, mas precisam passar pelo Gateway.
Motivo
Agora preciso implementar um recurso que exija comunicação em tempo real entre o frontend e um serviço interno. Mas como o serviço interno não é exposto ao exterior, preciso de uma maneira de "rotear" os dados em tempo real através do Gateway.
Todos os meus serviços estão em execução no Node.js, motivo pelo qual desejo usar o Socket.IO para implementar a comunicação em tempo real.
Questão
Mas como implementar a seta dupla roxa do esboço?
Geralmente, o cliente front-end se conecta ao servidor em que o Socket.IO está sendo executado. Mas, no meu caso, esse servidor (o servidor de recursos em tempo real) não pode ser acessado pelo cliente (e nunca deveria estar), o que significa que o cliente precisa se conectar ao Gateway. Portanto, o Gateway precisa implementar algum mecanismo para rotear todas as mensagens recebidas para o serviço em tempo real e vice-versa.
Ideias
(1) Tenha um segundo servidor HTTP escutando eventos no Gateway e emita esses eventos para o servidor em tempo real. Na outra direção, o servidor em tempo real emitirá eventos para o Gateway, que os emitirão para o frontend. Eu acho que essa abordagem definitivamente funcionará, mas parece redundante emitir tudo duas vezes. E isso definitivamente prejudicaria o desempenho?
(2) Use um adaptador Socket.IO para " passar evento entre nós ", o que parece ser o caminho certo, pois é usado para "transmitir mensagens entre processos ou computadores". Mas tenho problemas para começar devido à falta de documentação / exemplos. Também não estou usando Redis (é necessário usar o adaptador?)
(3) Use o pacote socket.io-emitter , que não parece ser uma boa opção, já que o último commit foi de 3 anos atrás.
(4) Algo mais?
nginx
como um controlador de entrada. Você também pode usar haproxy, se preferir. Você terá 2 serviços (implantação) 1 para gerenciar solicitações HTTP (s) e 1 para gerenciar solicitações de soquete. Usando o ingresso, você pode expor o caminho e redirecionar o tráfego para o serviço certo, por exemplo, toda solicitação atingida /socket
será redirecionada para o socket-service
aplicativo.
ingress-controller
k8s envia osocket
tráfego para o serviço de futebol.