ruby on rails - simple - ¿Cómo crear una comunicación de dúplex completo entre una API y una aplicación Rails?
ruby on rails api rest (1)
Tengo una API de transcodificación de video y una aplicación de CMS que la consume.
El flujo de trabajo es el siguiente:
- CMS envía una solicitud
GET
a la API para obtener una lista de archivos de video para transcodificar y obtiene la respuesta en formato JSON. - El usuario de CMS selecciona qué archivo se transcodifica y hace clic en el botón "Transcodificar".
- A medida que el usuario hace clic en el enlace, una solicitud
POST
va a la API y la API crea losProgress
necesarios internamente y responde con el estado inicial de los progresos en formato JSON. - Después de crear
Progress
es en la API, hago solicitudesGET
ajax a la API preguntando periódicamente por el estado actual del proceso. Porque es un requisito para mí mostrar el estado actual del usuario de los procesos de transcodificación (como el porcentaje ...). - Además, tengo otros recursos que debo informar a CMS sobre el estado actual.
En este momento, haré una llamada a AJAX a API una vez cada 5 segundos.
Aquí está la pregunta:
¿Es esta la mejor manera de hacerlo todo?
¿Hay alguna manera de crear comunicación full-duplex entre una API y una aplicación Rails?
Intenté las notificaciones push y push, pero parece que solo son para la comunicación de front-end. ¿Es esto cierto?
Había escuchado sobre websocket
pero no pude encontrar un buen recurso para entenderlo completamente.
¿Cuál es la forma aprobada de la comunidad de Rails para hacer lo que solicito?
Gracias
Para aclarar: necesita algo más que solo comunicación servidor -> cliente porque necesita informar al usuario / navegador y también a otros componentes en el CMS sobre el progreso.
Nota: no estoy seguro de en qué tecnología está escrita la API así que asumiré que Ruby
Basado en esto, Faye puede ser una muy buena solución. Tanto el navegador web como el servidor CMS pueden ser clientes de Faye y pueden suscribirse a las actualizaciones de la API. La API puede publicar actualizaciones en un canal apropiadamente nombrado en base al archivo de video que se está transcodificando.
La comunicación del servidor <-> API Faye del navegador se realizará a través del transporte WebSocket o de respaldo. Las comunicaciones del servidor CMS <-> API Faye pueden tener más de los mismos tipos de transporte o pueden usar un motor como redis.
- CMS envía una solicitud GET a la API para obtener una lista de archivos de video para transcodificar y obtiene la respuesta en formato JSON.
- El usuario de CMS selecciona qué archivo se transcodifica y hace clic en el botón "Transcodificar".
- A medida que el usuario hace clic en el enlace, una solicitud POST va a la API y API crea los Progresos necesarios internamente y responde con el estado inicial de los progresos en formato JSON y el canal para actualizaciones de progreso .
- Después de crear Progresses en la API, el cliente se suscribe al canal de actualizaciones. A medida que el progreso cambie, la API publicará el progreso de la actualización en el canal y el cliente recibirá las actualizaciones.
- El CMS de alguna manera también necesita saber el canal de progreso. Podría hacer esto teniendo un canal al que siempre se suscriba. La API puede publicar toda la información de transcodificación en ese canal, por ejemplo
video-transcoding
. Cuando vea que ha comenzado una nueva transcodificación, puede suscribirse al canal para obtener actualizaciones específicas de transcodificación de video.
Puede ser que la comunicación bidireccional no sea 100% necesaria. Parece que la API necesita enviar actualizaciones al CMS y al cliente. Si ese es el caso EventSource / Server-Sent Events puede ser una opción. Y si no desea que el CMS tenga una conexión persistente con la API y prefiera tener las actualizaciones enviadas a través de HTTP, puede agregar soporte WebHook a la API; en la progresión, realiza una solicitud HTTP al CMS para informarle del progreso.