Tengo una aplicación que reacciona a los mensajes enviados por los clientes. Un mensaje es reload_credentials
, que la aplicación recibe cada vez que se registra un nuevo cliente. Este mensaje se conectará a una base de datos PostgreSQL, realizará una consulta de todas las credenciales y luego las almacenará en un hash Ruby normal (client_id => client_token).¿Cómo debo manejar este caso de uso usando EventMachine?
Algunos otros mensajes que la aplicación puede recibir son start
, stop
, pause
que se utilizan para realizar un seguimiento de algunos tiempos de sesión. Mi punto es que preveo la aplicación que funciona de la siguiente manera:
- cliente envía un mensaje
- mensaje se pone en cola
- cola se está procesando
Sin embargo, por ejemplo, no me No quiero bloquear el reactor. Además, imaginemos que tengo un mensaje reload_credentials
que está próximo en cola. No quiero que se procese ningún otro mensaje de la cola hasta que las credenciales se vuelvan a cargar desde el DB. Además, mientras proceso un determinado mensaje (como esperar a que finalice la consulta de credenciales), deseo permitir que otros mensajes se pongan en cola.
Podría usted por favor me guía hacia la solución de un problema? Estoy pensando que debo usar em-synchrony
, pero no estoy seguro.
Pero, el mensaje reload_credentials podría recibirse varias veces. ¿No debería haber como 2 hilos? Uno que sigue haciendo cola y otro que está procesando? – Geo
Sí, si se recibe reload_credentials mientras se está procesando reload_credentials, se pondrá en cola como otros mensajes. – simulacre
Múltiples mensajes de reload_credentials deben manejarse como el primero. Al colocar las reload_credentials en un bloque EM.defer lo está ejecutando en otro hilo. Mientras su código de 'procesamiento' no sea bloqueado, seguirá recibiendo mensajes. Use bibliotecas compatibles con EM para asegurarse de no bloquear. Alternativamente, use EM.defer para el procesamiento. – simulacre