2008-09-23 19 views
16

Solo me preguntaba cómo lo harías. ¿Tendría algún tipo de proceso que analice todas las acciones que tuvieron lugar durante los últimos X minutos? ¿Activaría una verificación de actualización de insignia cada vez que se llevara a cabo alguna acción (voto por aumento, voto por disminución, etiqueta, etc.)? Parece que esto sería un proceso relativamente costoso de una forma u otra.¿Cómo implementarías un sistema de insignia como el de StackOverflow?

+0

Envíe un correo electrónico a Jeff Atwood, probablemente le dirá cómo lo hicieron y si recuerdo correctamente podría haberse discutido indirectamente en el podcast o tal vez en uno de los blogs. Yo olvido. –

Respuesta

12

Quizás un poco de ambos. Probablemente pondría en cola un cheque cada vez que ocurra una acción, y tendré un proceso que irá a la cola y determinará si se ha ganado una insignia para cada control. De esta forma, es un tiempo semi-real sin causar que las páginas tarden más en cargarse. De hecho, aquí en StackOverflow noté una demora entre cuando se gana la insignia y cuando el sistema se da cuenta, por lo que este sitio probablemente usa el mismo enfoque.

+0

Tenga en cuenta que, en realidad, no se trata de un tiempo real de desbordamiento de pila: algunas de mis insignias tuvieron que actualizarse en algunas páginas. –

+1

SO usa un truco que involucra las devoluciones de llamada de caché del servidor para imitar una tarea recurrente. Se discute en uno de los podcasts. –

+0

+1 Me acabo de dar cuenta de que también se puede calcular en cada acción, pero hacerlo en un hilo separado para no ralentizar el rendimiento del sitio. –

0

Yo personalmente tengo un trabajo cron o similar que procesa estos de forma regular. Probablemente en un sistema de flujo "cron falso", donde tendría una llamada de imagen invisible y pasaría por la "pila de cron" interna para ver qué hay que hacer.

Muchas de las insignias sin embargo, no debería ser necesario que mucho que ver con ellos ... ellos deben ser capaces de hacer con una consulta muy bien elaborado

+1

Las imágenes en blanco 1x1 son tan 2002. Hay maneras mejores en 2009, muchas de las cuales se mencionan en este hilo. – phidah

2

yo no daría lugar a una actualización cada vez que alguien hizo una acción; lo que haría en su lugar es un proceso por lotes que analiza cada acción realizada en el último minuto, resume el estado de "cada minuto" de cada usuario y da nuevas insignias basadas en eso.

+0

¿por qué todos los votos negativos? –

2

Usa una base de datos con 'ganchos/activadores'. Luego puede activar un evento en ciertos cambios de estado, por ejemplo, tiene una tabla que registra cada voto de una respuesta determinada.

Usted sabe que Answer> 10 Upvotes == "Good Answer", entonces usted acaba de poner un disparador que ocurre cuando LAST_STATE = 9 y NEXT_STATE = 10 y ENTRY_AWARDED_GOODANSWER = false.

Postgresql es una de esas bases de datos que admite dichos desencadenadores.

leer más aquí: http://www.postgresql.org/docs/8.1/static/triggers.html

+0

¿La transacción que actualiza el n. ° de Votos ascendentes estará esperando mientras se está ejecutando el desencadenador? ¿O la ejecución del disparador es asincrónica? –

+0

En postgres es MVCC. No entiendo cómo funciona, pero 2 personas pueden usar las mismas filas y no tener problemas. Los desencadenantes/tendentes/suceden como parte de la consulta desencadenante, simplemente haciendo el comando correcto en el desencadenante correcto puede dejar de suceder el cambio. –

1

probablemente me utilizar un servicio de Broker cola en SQL Server para enviar acciones en el procedimiento de la cola y la activación recoge el un montón de acciones a la vez y lo dirige contra una insignia procedimiento de comprobación. Un motor de reglas de insignia, por ejemplo.

0

Khan Academy hace todo lo posible para otorgar las insignias en tiempo real. Ellos argumentan que es importante para la sensación de gamey del sitio web. También tienen un trabajo por lotes que reevalúa periódicamente los datos y otorga las insignias perdidas.

Ben Kamens, Badges on App Engine: Implementing a real-time.... El blog fue publicado en enero de 2011, por lo que las cosas pueden haber cambiado desde entonces.

Cuestiones relacionadas