Armazenar um arquivo de imagens para um site no armazenamento BLOB do Azure

O artigo descreve a experiência de organizar o armazenamento orçamentário de um arquivo de imagens para um site com milhões de anúncios.



No meu caso, as imagens são entendidas como fotografias de apartamentos, casas, lotes, etc. Eu tenho meu próprio projeto, que é um site com anúncios para venda e aluguel de imóveis. O site existe há cerca de 6 anos e, durante esse período, um número bastante grande de anúncios se acumulou. Em cada cartão de objeto, as fotos são exibidas, em média 8 fotos por anúncio. Na verdade, vou armazenar essas fotos na nuvem para que depois eu possa mostrá-las aos visitantes em cartões de objeto.

Como eu as armazenei antes? - de jeito nenhum. Não guardei imagens, exceto as que foram colocadas manualmente. Na maioria dos casos, os anúncios chegam ao site por meio de parceiros por meio do upload automático de feeds. No feed de cada objeto, há links para fotos - eu armazeno os links e dou uma foto ao visitante diretamente do parceiro. Este circuito funciona muito bem e economiza uma tonelada de recursos.

As fotos que os visitantes veem na seleção de anúncios ou no cartão do objeto são carregadas com recursos de terceiros.

Há uma ressalva relacionada às especificidades do site - os objetos de arquivamento nunca são excluídos. I.e. depois que o anúncio é removido da publicação, certamente desaparece dos resultados da pesquisa, mas o link direto fica sempre disponível (sem os contatos do vendedor). Por algum tempo, os links para as fotografias ainda vivem, às vezes por anos, mas mais cedo ou mais tarde eles morrem. Objetos arquivados são valiosos porque os visitantes dos mecanismos de pesquisa continuam a acessá-los. Além disso, um mapa de preços é construído a partir do arquivo (eu já escrevi sobre ele ) e descobri acidentalmente uma fonte adicional de receita para o projeto na forma de vender informações de contato de objetos de arquivo. Por que eles os compram, não sei ao certo, mas suponho que os visitantes desejam obter contatos porque acham que o anúncio foi removido da publicação por acidente ou por engano. Provavelmente também acontece que eles querem aprender algo com os proprietários anteriores. De uma forma ou de outra, é mais provável que um anúncio com fotos nesse caso seja comprado. O valor das fotografias aumenta após a percepção dessa nuance.

A quantidade de dados que vou armazenar na nuvem é de cerca de 3-4 terabytes. Além de um ganho diário de vários gigabytes. Dado que essa inovação não trará dinheiro diretamente, ela pode afetar indiretamente a tomada de decisão do visitante, o orçamento em que eu queria encontrar um valor bastante modesto é de 1000 a 2000 r. por mês. Seria bom de graça, mas não encontrei essa oportunidade.

Azure


De alguma forma, imediatamente olhei para o Azure porque trabalho no .net e frequentemente vejo belos artigos de publicidade sobre esse tópico. Além disso, tenho que usar essa plataforma para o meu trabalho principal, mas minhas capacidades são limitadas pelos requisitos dos negócios e pelos desejos da gerência.

O Azure oferece armazenamento BLOB com três camadas de armazenamento: Hot, Cool e Archive. Os preços em todos os níveis são diferentes. Em geral, quanto mais quente, mais barata é a leitura / gravação e mais cara é a taxa mensal de armazenamento, e vice-versa. No Hot - é rentável escrever / ler e excluir muito, mas é caro armazenar por um longo tempo. O arquivo é barato para armazenar, mas caro para ler / gravar. Além disso, nos níveis frio e de arquivamento, há uma taxa para exclusão antecipada - isso significa que, se eu excluir (ou transferir para outro nível) um objeto antes de um determinado período, ainda serei cobrado por todo o período. Para o nível do arquivo, são 180 dias, para o frio - 30.

Preços


O custo de armazenamento é de US $ 0,0023 por GB por mês no nível do arquivo, US $ 0,01 no frio e US $ 0,0196 no quente. Na taxa atual, são aproximadamente 0,15, 0,65 e 1,28 rublos, respectivamente.

Comparei com o custo na Amazon e no Google, o Azure é mais barato.

AzureAmazônia (S3)Google
Quente$ 0,0196$ 0,024$ 0,026
CoolUS $ 0,01US $ 0,01US $ 0,01
Arquivo$ 0,0023$ 0,0045$ 0,007


Além do custo de armazenamento, é necessário levar em consideração o custo das operações - eles também são diferentes em todos os níveis. Os preços são para 10.000 transações.

Quente
Leia: $ 0,0043, Escreva: $ 0,054

Cool
Leia: $ 0,01, Escreva: $ 0,10

Arquivo
Leia: $ 6, Escreva: $ 0,12

Lógica de trabalho



Enquanto o anúncio estiver ativo, as fotos nele serão exibidas por links de recursos de terceiros (de parceiros). Depois que o anúncio é removido da publicação, ele se torna um arquivo, mas os links para as fotos ainda estão vivos por algum tempo. Cedo ou tarde, eles morrem e você precisa ter certeza de que a essa altura existe uma cópia do arquivo morto.

O processo de processamento de fotos pode ser descrito nas seguintes etapas:

  1. Assim que o anúncio desaparecer do arquivo de importação do parceiro, ou seja, o parceiro parou de publicá-lo, uma entrada é formada na fila de prioridades, onde a prioridade é o número de visualizações dos visitantes - quanto mais visualizações, maior a probabilidade de que o arquivo seja arquivado, o objeto será visualizado ainda mais.
  2. Ao processar um registro da fila, um objeto BLOB é formado contendo fotos reduzidas (até 800x600) para o anúncio. O uso de objetos compostos em vez de fotografar diretamente também se deve à economia - em vez de oito operações de gravação (uma média de 8 fotos por objeto), uma é executada e cada operação custa dinheiro.
  3. O BLOB é carregado primeiro no Hot e depois transferido imediatamente para o arquivo morto. Não há possibilidade de gravar diretamente no arquivo e, como o Cool cobra uma taxa pela exclusão antecipada, é mais barato usar o Hot como transporte.
  4. O arquivo BLOB é contanto que os links para as fotos originais estejam ativos (as fotos são mostradas até agora pelos links dos parceiros).
  5. Os links são verificados quanto à funcionalidade quando o visitante visita o cartão do objeto - se for para ele, o objeto é popular e faz sentido restaurar fotos do arquivo.
  6. Se os links para as fotos originais morrerem, eu verifico se há uma cópia do arquivo morto e, se for o caso, envio uma solicitação para restaurar do arquivo morto para o Cool (pode levar até 15 horas para restaurar um blob do arquivo morto - isso é chamado de reidratação da Microsoft).
  7. Depois que o BLOB é restaurado do arquivo, ele é copiado para o armazenamento local e dividido em fotos normais. O armazenamento local é o disco rígido do meu servidor.
  8. As fotos no cartão de anúncio já são fornecidas no armazenamento local.
  9. As fotos são armazenadas no armazenamento local por vários dias. Se durante esse período houver varreduras, o período de armazenamento local será estendido. Se não houver exibições, as fotos serão excluídas do armazenamento local, mas permanecerão no nível Legal no Azure.
  10. Do Cool para o Archive, eles são copiados se não houver visualizações por dois meses - o objeto claramente não é popular e, portanto, não faz sentido pagar a mais pelo armazenamento no Cool.


Primeiro lançamento


Quando o processo foi escrito e testado, estava na hora da operação de teste e havia problemas esperados. Na fila da época, havia cerca de 10 milhões de objetos, decidi iniciar a migração com 30.000 objetos por dia. Configure belos gráficos no painel e comecei a observar. Nas estatísticas, vi estranhos "ataques" com solicitações GetBlobProperties. Eles ocorrem com um intervalo aproximadamente igual de uma hora, sempre começam aproximadamente uma hora e meia após o início da migração e duram algum tempo após a conclusão.



O número de tais solicitações era muito grande para ignorá-las. Olhei para os logs e vi que essas solicitações não vêm do meu servidor, mas de endereços IP estrangeiros. Eu não queria pagar por eles.

Procurei na pilha e na documentação, mas sem sucesso. Escreveu uma pergunta sobre Stackoverflow e suporte técnico. Como resultado, após uma longa correspondência com o suporte técnico e o fornecimento de logs, eles me disseram que podem reproduzir a situação e isso é um bug do lado deles.

Uma nuance interessante é que minha pergunta no Stackoverflow foi respondida sem explicar os motivos, mas apenas confirmando que pagarei por essas solicitações, mas a pessoa que deu a resposta insistentemente me pediu para marcá-la como correta. Ele também sugeriu ao me passar que eles (em apoio) não são bem-vindos a espalhar bugs em seus próprios produtos. Eu o deixo saber que não farei isso até que ele escreva a verdade. Eu mesmo poderia escrever isso, mas pensei que a equipe de suporte técnico provavelmente medisse o número de respostas confirmadas, então pedi que ele escrevesse a verdadeira razão e, neste caso, marquei sua resposta como correta. Após alguma hesitação, ele concordou e complementou seu comentário com um relatório de erro. Em geral, gostei de como o suporte técnico funciona - fui transferido para uma garota russa que ainda me mantém informado sobre as mudanças nessa questão.

O fato de o bug ter sido reconhecido apenas me satisfez moralmente, mas eu queria colocar o mecanismo em operação e, ao mesmo tempo, não pagar por solicitações de canhotos. Especialmente considerando que normalmente me confundia para minimizar o número de solicitações e, portanto, o custo.

No suporte técnico, eles me aconselharam a aguardar o lançamento e, depois de algumas semanas, escreveram que o bug foi corrigido, mas quando o lançamento com a correção será, ele não será conhecido. Eles se ofereceram para habilitar o log e trabalhar dessa maneira e, após o lançamento, solicitar compensação na Microsoft. Na verdade, nesse modo, ele ainda funciona. Todos os dias inicio a migração de um pequeno número de objetos e espero o lançamento.

Conclusão


O custo de 30.000 objetos diários ainda é 900 p. por mês - e isso é bastante aceitável. A maioria das despesas são operações de gravação. Portanto, quando toda a fila for processada e o estágio do trabalho planejado for iniciado, ficará claro qual é o custo real desse armazenamento. Mas, de acordo com meus cálculos, isso acontecerá em cerca de um ano.

Quando houver uma liberação no armazenamento de Blob do Azure, adicionarei aqui se consegui obter compensação. Em relação às despesas mensais, isso representa cerca de 10% do custo.

Source: https://habr.com/ru/post/pt424841/


All Articles