5

Tengo una lista de usuarios que solo los administradores pueden ver (= pocas lecturas). Esta lista también muestra un recuento de la cantidad de usuarios en el almacén de datos. Debido a que la lista podría crecer más de 1000 mi primer pensamiento fue evitar un recuento normal() y en su lugar utilizar un contador sharded.¿Cómo creo un contador flexible con más de 1000 filas pero pocas lecturas en Google App Engine?

Sin embargo, el problema es que los administradores también tienen acceso a varios filtros de búsqueda (en la GUI), como solo ver usuarios masculinos/femeninos, y así sucesivamente. Es importante que el recuento refleje estos filtros, de modo que puedan obtener el número de usuarias, usuarios masculinos y una miríada de otras combinaciones.

Debido a esto, los contadores fragmentados y los contadores de concurrencia alta sin fragmentación no parecen una buena idea, porque necesitaría crear un contador para cada combinación de filtros de búsqueda.

¿Debo simplemente crear un bucle de métodos count(), como se describe here o es esta una muy mala práctica? ¿Cómo lo haría de otra manera?

Tenga en cuenta que este contador es para una interfaz de administrador y que tendría un número muy limitado de lecturas. Este es realmente un caso de cuando me gustaría sacrificar algo de rendimiento de lectura por flexibilidad y precisión. Aunque debería poder crecer más allá de 1000, no se espera que crezca más de 10 000.

Respuesta

2

"Loop of counts" es lento, pero en estos días puede mejorarlo con cursors. Normalmente recomendaría desnormalizar en todos los contadores "filtrados" que necesita, pero eso ralentiza la adición y eliminación de usuarios (y probablemente también cambios demográficos), por lo que, dado su caso de uso particular con un volumen muy bajo de lecturas, probablemente pueda salirse con la aproximación "loop of counts" (más cursores ;-).

+0

Gracias por su respuesta! Sí, estoy tentado por este enfoque, considerando que tendré muy pocas lecturas y ni siquiera estoy seguro de que la lista exceda 1000. Cuando hablas de cursores, ¿quieres decir que debería usar cursores para decidir el siguiente puesto de conteo?()? – Aneon

2

He intentado dos enfoques:

1) escribir mi propia tarea que consulta el almacén de datos (la consulta es una consulta clave descendente) con un límite fijo de entidades (digamos 50). Luego pone en cola la siguiente tarea para comenzar a consultar dónde quedó. Cada tarea pone en cola al siguiente pasando dos parámetros (donde se dejó como un cursor y un total acumulado de la cantidad de entidades que ha visto).

2) Este enfoque es mucho más fácil, y eso es usar la biblioteca mapreduce proporcionada por google para appengine. Funciona totalmente en el espacio de usuario, por lo que solo tiene que descargar y crear la biblioteca e incluirla en su proyecto. Básicamente, manejará iterar a través de todas las entidades que especifique y le permite escribir un controlador para saber qué hacer con cada una (como incrementar un contador). Vea los detalles aquí: mapreduce.appspot.com - incluso tienen una aplicación de muestra que hace justo lo que está pidiendo. El único problema con esto es que los resultados aparecerán en su navegador y no necesariamente almacenados en el almacén de datos a menos que usted mismo lo haga.

+0

El segundo enfoque descrito aquí, usando un mapreduce para volver a calcular, de manera regular, todas las estadísticas importantes, parece ser el mejor enfoque. –

+0

Oh, nunca antes había oído hablar de MapReduce, tendré que investigarlo. ¿Este enfoque me da una precisión total o será necesario actualizarlo periódicamente (como los contadores de concurrencia alta sin fragmentación que utiliza la cola de tareas)? ¿Y requiere que configure todas las combinaciones de filtros posibles que quiero contar manualmente? – Aneon

+0

Bueno, si el número de entidades que tiene está cambiando durante la reducción del mapa, esas entidades no se contarán. El mapa reduce básicamente toma una instantánea en un cierto punto en el tiempo. En NO le dará un recuento en tiempo real de la cantidad de entidades que tiene en un momento dado.Lo uso para producir estadísticas al final de cada día. – aloo