Stackoverflow tiene un sistema de insignia ingenioso. Una cosa que noté es que las insignias no se conceden de inmediato, pero a veces parecen tener algún tipo de retraso después de cumplir con los criterios. Me he dado cuenta de esto en algunos otros sitios que también tienen insignias.¿Por qué sitios como stackoverflow con insignias usan algún tipo de trabajo retrasado para determinar cuándo otorgar una nueva insignia?
Se supone que esto se debe a que están utilizando un trabajo demorado que escanea periódicamente para ver si se deben otorgar nuevas insignias. Veo este enfoque también aconsejó aquí:
How to implement badges?
Sin embargo, yo no veo por qué esto debería ser necesario, y estoy favoreciendo de mi aplicación simplemente tener un sistema en el que se lleva a cabo después de una acción relevante, por ejemplo, se publica un nuevo comentario, se llama a una función checkAwardBadge, que verifica si el usuario cumple los criterios para una nueva insignia de comentario.
Speedwise, pensaba que todas las estadísticas de usuario relevantes simplemente se guardarían en un submodelo de Usuario, como UserStats, de modo que en lugar de tener que contar el número de comentarios cada vez, sería una simple consulta.
Me parece que el sistema que estoy favoreciendo debe ser rápido y muy simple de entender. ¿Hay algún inconveniente que me falta aquí sobre por qué es necesario complicar las cosas con trabajos retrasados?
Para aclarar: Planeo tener un Logros de clase abstracta, con cada Logro real una implementación de Logros. Cada logro tendrá una función checkAwardBadge, que se puede llamar desde el controlador, o incluso un trabajo retrasado si yo elijo ir por esa ruta, o en cualquier momento realmente, para verificar si un usuario ha obtenido una determinada insignia. Por lo tanto, el código de logro estaría centralizado.
(1) y (2) la penalización de rendimiento sería muy leve en esto. Solo una consulta simple de una fila a la base de datos, seguida de alguna lógica simple como (X> 30) (3) Podría explicar por qué esto no se escalaría (4) En realidad lo haría. Planeo crear una clase de Logros, con cada Logro una subclase. Entonces, solo necesitaría agregar una sola línea al código del controlador en la mayoría de los casos para hacer una llamada a checkAwardBadge en la insignia correspondiente. –
(3) Solo un ejemplo: supongamos que tiene una acción como eliminar un comentario, que no activa ninguna insignia, pero más adelante necesita otorgar una insignia cuando el usuario borra un comentario, tiene que volver para buscar todo el código que elimine un Comentario y agregue la llamada a checkAwardBadge. Imagínate en escenarios más complejos. –
No escala, porque cuando tienes más de 100,000 usuarios y 10,000,000 de acciones, tienes que golpear la base de datos después de cada acción de cada usuario para consultar. Si, en cambio, descarga el trabajo a un hilo de trabajo (espere), entonces eso puede ejecutarse en segundo plano y actualizar periódicamente las insignias de cada usuario. Puede ser inteligente, por ejemplo, escaneando solo las actividades que se crearon desde que se ejecutó el hilo por última vez, etc. – BryanH