Esencia
Tengo una aplicación que se ejecuta en una arquitectura basada en microservicios (en Kubernetes). Toda la comunicación hacia / desde fuera de la aplicación ocurre a través de un API Gateway .
Lo que significa que las solicitudes de mi interfaz no van directamente a los servicios, sino que tienen que pasar por el Gateway.
Motivo
Ahora necesito implementar una función que requiera comunicación en tiempo real entre la interfaz y un servicio interno. Pero como el servicio interno no está expuesto al exterior, necesito una forma de "enrutar" los datos en tiempo real a través de la puerta de enlace.
Todos mis servicios se ejecutan en Node.js, por lo que quiero usar Socket.IO para implementar la comunicación en tiempo real.
Problema
Pero, ¿cómo implementar la flecha doble púrpura del boceto?
Por lo general, el cliente frontend se conectaría al servidor donde se ejecuta Socket.IO. Pero en mi caso, este servidor (el servidor de funciones en tiempo real) no es accesible desde el cliente (y nunca debería serlo), lo que significa que el cliente tiene que conectarse a la puerta de enlace. Por lo tanto, el Gateway necesita implementar algún mecanismo para enrutar todos los mensajes entrantes al servicio en tiempo real y viceversa.
Ideas
(1) Haga que un segundo servidor HTTP escuche eventos en el Gateway y emita esos eventos al servidor en tiempo real. En la otra dirección, el servidor en tiempo real emitirá eventos a la puerta de enlace, que luego los emitirá a la interfaz. Creo que este enfoque definitivamente funcionará, pero parece redundante emitir todo dos veces. ¿Y definitivamente dañaría el rendimiento?
(2) Use un adaptador Socket.IO para " pasar el evento entre nodos ", lo que parece ser el camino correcto porque se usa para "pasar mensajes entre procesos o computadoras". Pero tengo problemas para comenzar debido a la falta de documentación / ejemplos. Tampoco estoy usando Redis (¿es necesario usar el adaptador?)
(3) Use el paquete socket.io-emitter , que no parece ser una buena opción ya que la última confirmación fue de hace 3 años.
(4) ¿Algo más?
nginx
como controlador de ingreso. También puede usar haproxy si lo prefiere. Tendrá 2 servicios (implementación) 1 para administrar las solicitudes HTTP (s) y 1 para administrar las solicitudes de socket. Con el ingreso, puede exponer la ruta y redirigir el tráfico al servicio adecuado, por ejemplo, cada solicitud que /socket
se redirija a la socket-service
aplicación.
ingress-controller
k8s envía elsocket
tráfico al servicio de fútbol.