¿Por qué la visualización de mensajes es lenta en la mayoría de los sitios web?
10
¿Te das cuenta de que los recuentos de videos de YouTube siempre son lentos? Por ejemplo, un video tiene como 1000 comentarios y aún tiene 500 visitas, y tendrá 10000 visitas horas después.
Youtube no está solo en esto. La mayoría de los tableros de mensajes se implementan de esa manera y los recuentos de vistas se actualizan cada 10 minutos aproximadamente.
Grabar vistas es muy simple, simplemente agregue una fila a una tabla que represente la acción "ver". Esto es rápido porque no se requiere bloqueo en la base de datos, solo está agregando una fila al final de un montón.
Agregar eso en el número total de vistas requiere algo como hacer, lo SELECT COUNT(*) FROM ...que significa que debe bloquear la tabla mientras el cálculo avanza. Alternativamente, UPDATE ... SET num_views = num_views + 1también requiere que bloquee esa fila en particular cada vez que alguien la vea.
Entonces, desde el punto de vista de la escalabilidad, es mucho más eficiente agregar una fila cada vez que alguien ve el video y luego hacer SELECT COUNT(*) FROM ...cada diez minutos más o menos.
Tenga en cuenta que en realidad no sé la arquitectura de YouTube, o si incluso el uso de una base de datos relacional para almacenar sus datos, pero lo que hacen uso, el principio es probable que la misma: la inserción de datos es barato, la agregación de valores es (relativamente) caro .
@Dean Harding Gracias, pero ¿no significa que la tabla tendría miles de millones, si no trillones, de registros para un sitio web incluso con tráfico moderado, mucho menos youtube? Con tales registros masivos, sospecho que SELECT COUNT (*) tendría un impacto en el rendimiento de la base de datos incluso si se ejecuta solo cada 10 minutos. Esto también requeriría más espacio en disco para la base de datos y la copia de seguridad. No estoy diciendo que bloquear la tabla en cada visita a la página sea mejor, pero me resulta difícil entender cómo los grandes sitios web manejarían datos tan grandes.
Tom Tucker
No es la primera vez que escucho esto. Lo que realmente me desconcierta es que incrementar un contador de manera segura es más difícil o más costoso que agregarlo a una lista. Si puede resolver lo último, lo primero debería ser realmente fácil.
back2dos
2
@Tom Tucker: sí, pero estamos hablando de Google aquí, recuerde :-) Una forma de resolver este problema en una escala menor es que una vez que haya terminado la agregación, truncaría la tabla que se agregó los datos se calcularon a partir de. Por lo tanto, nunca obtiene más de una hora (o lo que sea que actualice el intervalo) de datos "en bruto".
Dean Harding
44
También tenga en cuenta que los datos en su tabla de "acciones" pueden usarse para algo más que calcular el "número de vistas". También puede usarlo para implementar bloques de IP (es decir, "no más de 1 comentario cada 10 segundos desde la misma IP", etc.). También podría generar gráficos que muestren el número de vistas a lo largo del tiempo y otros tipos de cosas que un simple num_views = num_views + 1no permite.
Dean Harding
8
Lo más probable es que el valor se haya almacenado en caché en algún lugar del camino, por lo que está viendo datos obsoletos. Debido a que no es crítico que estos datos sean precisos, los desarrolladores han decidido favorecer el rendimiento en lugar de actualizar los datos. Realmente no querría ir a la base de datos y hacer un recuento de filas para cada visita en el sitio solo para actualizar esta cifra para que no lo hagan, solo la almacenan en caché por un tiempo.
Para que los sitios grandes escalen, tienen que realizar el almacenamiento en caché en varias etapas. Puede ser el almacenamiento en caché de páginas, el almacenamiento en caché de subpáginas y / o el almacenamiento en caché de registros. Es posible que tenga una combinación de todos ellos en efecto. Por ejemplo, si la página de youtube se almacena en caché hasta que se agregue un nuevo comentario, verá algún retraso hasta que alguien publique un comentario.
Hay varias formas de medir las vistas de página:
Almacénelo en la base de datos como un registro: fácil de insertar, sin embargo, es una sobrecarga de mantenimiento importante para los registros que solo proporcionan un recuento.
Almacénelo en la base de datos como un registro y acumule los recuentos periódicamente: fácil de insertar, procesamiento por lotes para recopilar las estadísticas que desea y se limpia después de sí mismo.
Actualice una columna de recuento en la base de datos: costosa de actualizar (suponiendo el bloqueo de filas), sin gastos generales de mantenimiento, rendimiento negativo cuando se trata de varias personas que solicitan la misma página al mismo tiempo.
Procese el archivo de registro de acceso cuando se transfiera: no hay datos adicionales en la base de datos, todo el procesamiento se realiza en lotes fuera de línea y las estadísticas de resumen que desea se actualizan cuando sea el momento.
De los elementos anteriores, todas las opciones excepto una sugieren que las actualizaciones se realizarán en lotes. El número de vistas no es realmente un atributo de tiempo crítico, por lo que está bien. Sin embargo, hacer que la gente espere para ver un video en YouTube porque la base de datos de back-end no puede mantenerse al día es una acción crítica. Eso significa que actualizar una columna en la base de datos no funcionará para un sitio tan grande como YouTube. Personalmente, no me sorprendería si optaran por la opción final. Los servidores web registrarán una gran cantidad de información para cada visita, incluida la IP que está utilizando, cómo lo remitieron a la página, etc. Solo tiene sentido procesarlos en lotes y resumir los resultados según sea necesario.
Nunca pensé en la última solución, ¡muy inteligente! Eso solo vale +1.
Tom Tucker
1
Utilizamos ese enfoque para manejar las listas de páginas "más populares" del día / semana / mes. Pusimos los recuentos en un archivo de propiedades simple por días, semanas y meses. El día actual se volvería a procesar cada hora, y los archivos de resumen restantes se trataron como las cintas de respaldo del abuelo / padre / hijo. Esencialmente, no necesitábamos más de 8 archivos de resumen (resúmenes semanales y un archivo de resumen para cada día de la semana actual).
Berin Loritsch
Es similar a cómo funciona RRDTool , aunque RRDTool es mucho más complejo que su solución con su elegante simplicidad.
Jörg W Mittag
0
Esto podría deberse a varias razones. Todo se reduce a los algoritmos utilizados por cada sitio web respectivo. A menos que alguien aquí sea en realidad un desarrollador de YouTube, dudo que obtenga una respuesta exacta aquí.
num_views = num_views + 1
no permite.Lo más probable es que el valor se haya almacenado en caché en algún lugar del camino, por lo que está viendo datos obsoletos. Debido a que no es crítico que estos datos sean precisos, los desarrolladores han decidido favorecer el rendimiento en lugar de actualizar los datos. Realmente no querría ir a la base de datos y hacer un recuento de filas para cada visita en el sitio solo para actualizar esta cifra para que no lo hagan, solo la almacenan en caché por un tiempo.
fuente
Para que los sitios grandes escalen, tienen que realizar el almacenamiento en caché en varias etapas. Puede ser el almacenamiento en caché de páginas, el almacenamiento en caché de subpáginas y / o el almacenamiento en caché de registros. Es posible que tenga una combinación de todos ellos en efecto. Por ejemplo, si la página de youtube se almacena en caché hasta que se agregue un nuevo comentario, verá algún retraso hasta que alguien publique un comentario.
Hay varias formas de medir las vistas de página:
De los elementos anteriores, todas las opciones excepto una sugieren que las actualizaciones se realizarán en lotes. El número de vistas no es realmente un atributo de tiempo crítico, por lo que está bien. Sin embargo, hacer que la gente espere para ver un video en YouTube porque la base de datos de back-end no puede mantenerse al día es una acción crítica. Eso significa que actualizar una columna en la base de datos no funcionará para un sitio tan grande como YouTube. Personalmente, no me sorprendería si optaran por la opción final. Los servidores web registrarán una gran cantidad de información para cada visita, incluida la IP que está utilizando, cómo lo remitieron a la página, etc. Solo tiene sentido procesarlos en lotes y resumir los resultados según sea necesario.
fuente
Esto podría deberse a varias razones. Todo se reduce a los algoritmos utilizados por cada sitio web respectivo. A menos que alguien aquí sea en realidad un desarrollador de YouTube, dudo que obtenga una respuesta exacta aquí.
fuente