Pergunta

Eu estive lendo um livro e eu tenho uma pergunta particular sobre o ETag capítulo.O autor diz que ETags pode prejudicar o desempenho e o que você deve ajustá-los finamente ou desativá-los completamente.

Eu já sei o que ETags são e compreender os riscos, mas é tão difícil chegar ETags certo?

Eu acabei de fazer uma aplicação que envia um ETag cujo valor é o MD5 hash do corpo da resposta.Esta é uma solução simples, fácil de conseguir em muitos idiomas.

  • É utilizando o hash MD5 de resposta do corpo como ETag errado?Se assim for, por quê?

  • Por que o autor (que, obviamente, engana-me por muitas ordens de magnitude) não propor uma solução simples?

Essa última pergunta é difícil de responder, a menos que você seja o autor :), então eu estou tentando encontrar os pontos fracos do utilizando um hash de MD5 como um ETag.

Foi útil?

Solução

O ETAG é semelhante ao cabeçalho de último modificado. É um mecanismo para determinar a mudança pelo cliente.

Indiscutivelmente, um ETAG que é a última data modificada (ou seja, o mesmo texto) atende a todos os critérios necessários para um ETAG. Simplesmente precisa ser um valor único representando o estado de um recurso. Não é único em todo o domínio dos recursos, simplesmente dentro do recurso.

Agora, tecnicamente, um ETAG tem uma resolução "infinita" em comparação com um cabeçalho de última hora. O último modificado é apenas alterações em uma granularidade de 1 segundo, enquanto um ETAG pode ser subconte.

Você pode implementar o ETAG e o último modificado, ou simplesmente um ou outro (ou nenhum, é claro). Se você, de última vez, não é suficiente, considere um ETAG.

Lembre -se, eu não definiria o ETAG para "todo" recurso. Basicamente, eu não o definiria para nada que não tenha expectativa de ser armazenado em cache (o conteúdo dinâmico notavelmente). Não faz sentido nesse caso, apenas desperdiçou o trabalho.

EDIT: Eu vejo sua edição e esclarecer.

MD5 está bem. A única desvantagem é calcular o MD5 o tempo todo. Executar o MD5 em, digamos, um arquivo PDF de 200k, é caro. A execução do MD5 em um recurso que não tem expectativa de ser armazenado em cache é simplesmente um desperdício (ou seja, conteúdo dinâmico).

O truque é simplesmente que qualquer mecanismo que você use, deve ser tão barato quanto o último modificado normalmente é. O último modificado é, novamente, normalmente, uma propriedade do recurso e, geralmente, muito barato de acessar.

ETAGS deve ser igualmente barato. Se você estiver usando o MD5 e pode armazenar em cache/armazenar a associação entre o recurso e o hash MD5, essa é uma solução fina. No entanto, recalcular o MD5 sempre que o ETAG é necessário, é basicamente contra a idéia de usar o ETAGS para melhorar o desempenho geral do servidor.

Outras dicas

Estamos usando ETAGS para nosso conteúdo dinâmico no Instela.

Nossa estratégia está no final da saída, gerando o hash do MD5 do conteúdo a ser enviado e, se existir o cabeçalho do IF-NONE, comparamos o cabeçalho com o hash gerado. Se os dois valores forem os mesmos, enviamos o código 304 e interromperá a solicitação sem devolver nenhum conteúdo.

É verdade que consumimos um pouco de CPU para hash o conteúdo, mas finalmente estamos economizando muita largura de banda.

Temos uma página principal do estilo de feed de notícias do Facebook, que possui conteúdo diferente para todos os usuários. À medida que o conteúdo do feed de notícias muda apenas 3-4 tempo por hora, as atualizações da página principal são muito eficientes para o lado do cliente. Na era móvel, acho melhor gastar um pouco mais de tempo da CPU do que gastar largura de banda. A largura de banda ainda é mais cara que a CPU, e é uma experiência melhor para o cliente.

Não tendo lido o livro, não posso falar sobre as preocupações precisas do autor.

No entanto, a geração de ETAGs deve ser tal que um ETAG seja gerado apenas uma vez quando uma página foi alterada. Gerar um hash md5 de uma página da web custa potência e tempo no servidor; Se você tiver muitos clientes conectando, isso pode começar a causar problemas de desempenho.

Assim, você precisa de uma boa técnica para gerar ETAGS quando necessário e em cache no servidor até que a página relacionada mude.

Eu acho que o perceived problem com ETAGS é, provavelmente, o seu browser tem de emitir e analisar uma (simples e pequeno) de solicitação / resposta para cada recurso em sua página para verificar se o valor de etag mudou de lado do servidor.

Eu pessoalmente acho estes pequenos extras viagens de ida e volta para o servidor aceitável que, muitas vezes, alterando as imagens, css, javascript (o servidor não é necessário reenviar o conteúdo, se o navegador do etag é o actual) uma vez que o mecanismo o torna bastante fácil a marca de 'atualização' de conteúdo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top