Por que a contagem de visualizações de mensagens está atrasada na maioria dos sites?
10
Observe como as contagens de exibição dos vídeos do youtube estão sempre atrasadas? Por exemplo, um vídeo tem 1000 comentários e ainda 500 hits, e terá 10000 hits horas depois.
O Youtube não está sozinho nisso. A maioria dos fóruns é implementada dessa maneira e as contagens de visualizações são atualizadas a cada 10 minutos.
A gravação de visualizações é muito simples, basta adicionar uma linha a uma tabela que representa a ação "visualizar". Isso é rápido porque nenhum bloqueio é necessário no banco de dados, você está apenas adicionando uma linha ao final de um heap.
Agregar isso ao número total de visualizações requer algo como fazer, o SELECT COUNT(*) FROM ...que significa que você deve bloquear a tabela enquanto o cálculo está em andamento. Como alternativa, UPDATE ... SET num_views = num_views + 1também exige que você bloqueie essa linha específica sempre que alguém a visualizar.
Portanto, do ponto de vista da escalabilidade, é muito mais eficiente adicionar uma linha cada vez que alguém vê o vídeo e, a SELECT COUNT(*) FROM ...cada dez minutos, aproximadamente.
Nota Eu realmente não sei a arquitetura do YouTube, ou se até mesmo usar um banco de dados relacional para armazenar seus dados, mas o que eles fazem uso, o princípio é provável que o mesmo: inserção de dados é barato, agregando valores é (relativamente) caros .
@ Dean Harding Obrigado, mas isso não significa que a tabela teria bilhões, se não trilhões, de registros para um site, mesmo com tráfego moderado, e muito menos youtube? Com esses registros maciços, suspeito que SELECT COUNT (*) teria um impacto no desempenho do banco de dados, mesmo que fosse executado a cada 10 minutos. Isso também exigiria mais espaço em disco para o banco de dados e o backup. Não estou dizendo que bloquear a tabela em cada página é melhor, mas acho difícil entender como sites grandes lidariam com dados tão grandes.
Tom Tucker
Não é a primeira vez que ouço isso. O que realmente me intriga é que incrementar um contador de maneira segura é mais difícil ou mais caro do que anexar a uma lista. Se você pode resolver o último, o primeiro deve ser realmente fácil.
fácil
2
@ Tom Tucker: sim, mas estamos falando do Google aqui, lembre-se :-) Uma maneira de resolver esse problema em uma escala menor é que, assim que terminar a agregação, truncaria a tabela que o agregado os dados foram calculados a partir de. Portanto, você nunca recebe mais do que uma hora (ou o intervalo de atualização) de dados "brutos".
Dean Harding
4
Lembre-se também de que os dados da tabela "ações" podem ser usados para mais do que apenas calcular o "número de visualizações". Você também pode usá-lo para implementar blocos de IP (ou seja, "não mais que 1 comentário a cada 10 segundos do mesmo IP" etc). Você também pode gerar gráficos mostrando o número de visualizações ao longo do tempo e outros tipos de coisas que um simples num_views = num_views + 1não permite.
Dean Harding
8
Provavelmente, o valor foi armazenado em cache em algum lugar ao longo do caminho, para que você esteja vendo dados obsoletos. Como não é essencial que esses dados sejam precisos, os desenvolvedores decidiram favorecer o desempenho em vez de atualizar os dados. Você realmente não gostaria de ir ao banco de dados e fazer uma contagem de linhas para cada ocorrência no site apenas para atualizar esse número, para que não o façam, apenas armazenam em cache por um tempo.
Para que os sites grandes sejam dimensionados, eles precisam executar o cache em vários estágios. Isso pode ser o cache de páginas, o cache de subpáginas e / ou o cache de registros. Você pode ter uma combinação de todos eles em vigor. Por exemplo, se a página do YouTube for armazenada em cache até que um novo comentário seja adicionado, você verá algum atraso até que alguém poste um comentário.
Existem várias maneiras de medir as visualizações de página:
Armazene-o no banco de dados como um registro: fácil de inserir, no entanto, é uma grande sobrecarga de manutenção para registros que fornecem apenas uma contagem.
Armazene-o no banco de dados como um registro e acumule as contagens periodicamente: fácil de inserir, processamento em lote para reunir as estatísticas desejadas e limpar depois de si próprio.
Atualize uma coluna de contagem no banco de dados: atualização dispendiosa (assumindo o bloqueio de linhas), sem sobrecarga de manutenção, desempenho negativo ao lidar com várias pessoas solicitando a mesma página ao mesmo tempo.
Processe o arquivo de log de acesso ao rolar: nenhum dado extra no banco de dados, todo o processamento é feito em lotes off-line e as estatísticas de resumo que você deseja são atualizadas quando chegar a hora.
Fora dos itens acima, todos, exceto uma opção, sugerem que as atualizações serão feitas em lotes. O número de visualizações não é realmente um atributo de tempo crítico, portanto, tudo bem. No entanto, manter as pessoas esperando para assistir a um vídeo no YouTube, porque o banco de dados back-end não pode acompanhar, é uma ação crítica. Isso significa que a atualização de uma coluna no banco de dados não funcionará em um site tão grande quanto o YouTube. Eu, pessoalmente, não ficaria surpreso se eles optassem pela opção final. Os servidores da Web gravarão toda uma série de informações para cada visita, incluindo o IP que você está usando, como você foi encaminhado para a página etc. etc. Faz sentido processar aqueles em lotes e resumir os resultados conforme necessário.
Nunca pensei na última solução - muito inteligente! Só isso vale +1.
Tom Tucker
11
Usamos essa abordagem para lidar com as listas de páginas "mais populares" do dia / semana / mês. Nós acumulamos as contagens em um arquivo de propriedades simples por dias, semanas e meses. O dia atual seria reprocessado a cada hora e os arquivos de resumo restantes eram tratados como as fitas de backup avô / pai / filho. Essencialmente, não precisávamos de mais de 8 arquivos de resumo (resumos semanais e um arquivo de resumo para cada dia da semana atual).
Berin Loritsch
É parecido com o funcionamento do RRDTool , embora o RRDTool seja muito mais complexo que sua solução com sua simplicidade elegante.
Jörg W Mittag
0
Isso pode ser devido a vários motivos. Tudo se resume aos algoritmos usados por cada site respectivo. A menos que alguém aqui seja realmente um desenvolvedor do YouTube, duvido que você obtenha uma resposta exata aqui.
num_views = num_views + 1
não permite.Provavelmente, o valor foi armazenado em cache em algum lugar ao longo do caminho, para que você esteja vendo dados obsoletos. Como não é essencial que esses dados sejam precisos, os desenvolvedores decidiram favorecer o desempenho em vez de atualizar os dados. Você realmente não gostaria de ir ao banco de dados e fazer uma contagem de linhas para cada ocorrência no site apenas para atualizar esse número, para que não o façam, apenas armazenam em cache por um tempo.
fonte
Para que os sites grandes sejam dimensionados, eles precisam executar o cache em vários estágios. Isso pode ser o cache de páginas, o cache de subpáginas e / ou o cache de registros. Você pode ter uma combinação de todos eles em vigor. Por exemplo, se a página do YouTube for armazenada em cache até que um novo comentário seja adicionado, você verá algum atraso até que alguém poste um comentário.
Existem várias maneiras de medir as visualizações de página:
Fora dos itens acima, todos, exceto uma opção, sugerem que as atualizações serão feitas em lotes. O número de visualizações não é realmente um atributo de tempo crítico, portanto, tudo bem. No entanto, manter as pessoas esperando para assistir a um vídeo no YouTube, porque o banco de dados back-end não pode acompanhar, é uma ação crítica. Isso significa que a atualização de uma coluna no banco de dados não funcionará em um site tão grande quanto o YouTube. Eu, pessoalmente, não ficaria surpreso se eles optassem pela opção final. Os servidores da Web gravarão toda uma série de informações para cada visita, incluindo o IP que você está usando, como você foi encaminhado para a página etc. etc. Faz sentido processar aqueles em lotes e resumir os resultados conforme necessário.
fonte
Isso pode ser devido a vários motivos. Tudo se resume aos algoritmos usados por cada site respectivo. A menos que alguém aqui seja realmente um desenvolvedor do YouTube, duvido que você obtenha uma resposta exata aqui.
fonte