El artículo describe la experiencia de organizar el almacenamiento de presupuesto de un archivo de imágenes para un sitio con millones de anuncios.

En mi caso, las imágenes se entienden como fotografías de apartamentos, casas, parcelas, etc. Tengo mi
propio proyecto, que es un sitio con anuncios para la venta y alquiler de bienes inmuebles. El sitio ha existido durante aproximadamente 6 años y durante este tiempo se ha acumulado una cantidad bastante grande de anuncios. En cada tarjeta de objeto se muestran fotos, en promedio 8 fotos por anuncio. En realidad, voy a almacenar estas fotos en la nube para luego mostrarlas a los visitantes en tarjetas de objetos.
¿Cómo los almacené antes? De ninguna manera. No guardé imágenes, excepto las que se colocaron manualmente. En la mayoría de los casos, los anuncios llegan al sitio a través de socios mediante la carga automática de feeds. En el feed de cada objeto hay enlaces a fotos: almaceno los enlaces y le doy al visitante una foto directamente del socio. Este circuito funciona muy bien y ahorra una tonelada de recursos.
Las fotos que los visitantes ven en la
selección de anuncios o en la
tarjeta del objeto en realidad se cargan de recursos de terceros.
Hay una advertencia relacionada con los detalles del sitio: los objetos de archivo nunca se eliminan. Es decir una vez que el anuncio se elimina de la publicación, ciertamente desaparece de los resultados de búsqueda, pero el enlace directo siempre está disponible (sin los contactos del vendedor). Durante algún tiempo, los enlaces a las fotografías siguen vivos, a veces durante años, pero tarde o temprano mueren. Los objetos archivados son valiosos porque los visitantes de los motores de búsqueda continúan llegando a ellos. Además, se
crea un mapa de precios a partir del archivo (ya
escribí sobre él ), y descubrí accidentalmente una fuente adicional de ingresos para el proyecto en forma de venta de información de contacto de objetos de archivo. No sé con certeza por qué los compran, pero supongo que los visitantes quieren obtener contactos porque piensan que el anuncio fue eliminado de la publicación por accidente o por error. También es probable que quieran aprender algo de los propietarios anteriores. De una forma u otra, es más probable que se compre un anuncio con fotos en este caso. El valor de las fotografías aumenta después de darse cuenta de este matiz.
La cantidad de datos que voy a almacenar en la nube es de aproximadamente 3-4 terabytes. Además de una ganancia diaria de varios gigabytes. Dado que esta innovación no traerá dinero directamente, solo puede afectar indirectamente la toma de decisiones del visitante, el presupuesto en el que quería cumplir con uno muy modesto es 1000-2000 r. por mes Sería agradable de forma gratuita, pero no encontré esa oportunidad.
Azur
De alguna manera, inmediatamente miré hacia Azure porque trabajo en .net, y a menudo veo hermosos artículos publicitarios sobre este tema. Además, tengo que usar esta plataforma para mi trabajo principal, pero allí mis capacidades están limitadas por los requisitos del negocio y los deseos de la gerencia.
Azure ofrece almacenamiento BLOB con tres niveles de almacenamiento: Hot, Cool y Archive. Los precios en todos los niveles son diferentes. En general, cuanto más caliente, más barata es la lectura / escritura y más costosa la tarifa de almacenamiento mensual, y viceversa. En caliente: es beneficioso escribir / leer y eliminar mucho, pero es costoso almacenarlo durante mucho tiempo. El archivo es barato de almacenar pero caro de leer / escribir. Además, en los niveles de archivo y frío, hay una tarifa por eliminación anticipada; esto significa que si elimino (o transfiero a otro nivel) un objeto antes de un cierto período, aún se me cobrará por todo el período. Para el nivel de archivo, esto es 180 días, para el frío - 30.
Precios
El costo de almacenamiento es de $ 0.0023 por GB por mes a nivel de archivo, $ 0.01 en frío y $ 0.0196 en caliente. A la tasa actual, esto es aproximadamente 0,15, 0,65 y 1,28 rublos, respectivamente.
Comparado con el costo en Amazon y Google, resulta que Azure es más barato.
| Azur | Amazon (S3) | Google |
Caliente | $ 0.0196 | $ 0.024 | $ 0.026 |
Genial | $ 0.01 | $ 0.01 | $ 0.01 |
Archivo | $ 0.0023 | $ 0.0045 | $ 0.007 |
Además del costo de almacenamiento, es necesario tener en cuenta el costo de las operaciones; también son diferentes en todos los niveles. Los precios son por 10,000 transacciones.
CalienteLeer: $ 0.0043, Escribir: $ 0.054
GenialLeer: $ 0.01, Escribir: $ 0.10
ArchivoLeer: $ 6, Escribir: $ 0.12
Lógica de trabajo
Mientras el anuncio está activo, las fotos se muestran mediante enlaces de recursos de terceros (de socios). Después de que el anuncio se elimina de la publicación, se convierte en archivo, pero los enlaces a las fotografías siguen vivos por algún tiempo. Tarde o temprano, mueren, y debe asegurarse de que para este momento haya una copia de archivo.
El proceso de procesamiento de fotos se puede describir en los siguientes pasos:
- Tan pronto como el anuncio desaparezca del archivo de importación de socios, es decir el socio dejó de publicarlo, se forma una entrada en la cola de prioridad, donde la prioridad es la cantidad de visitas de los visitantes: cuantas más vistas, más probabilidades hay de que se archiven, el objeto se verá más.
- Al procesar un registro desde la cola, se forma un objeto BLOB que contiene fotos reducidas (hasta 800x600) para el anuncio. El uso de objetos compuestos en lugar de fotografías directas también se debe al ahorro: en lugar de 8 operaciones de grabación (un promedio de 8 fotos por objeto), se realiza una y cada operación cuesta dinero.
- BLOB se carga primero en Hot, y luego se transfiere inmediatamente al archivo. No hay posibilidad de escribir directamente en el archivo, y dado que Cool tiene una tarifa por eliminación anticipada, es más barato usar Hot como tránsito.
- El archivo BLOB es siempre que los enlaces a las fotos originales estén activos (las fotos se muestran hasta ahora por enlaces de socios).
- Se verifica la funcionalidad de los enlaces cuando el visitante visita la tarjeta del objeto; si lo visita, entonces el objeto es popular y tiene sentido restaurar las fotos del archivo.
- Si los enlaces a las fotos originales han desaparecido, verifico si hay una copia de archivo, y si es así, envío una solicitud para restaurar desde el archivo a Cool (puede tomar hasta 15 horas restaurar un blob del archivo, esto se llama rehidratación de Microsoft).
- Una vez que el BLOB ha sido restaurado del archivo, se copia al almacenamiento local y se divide en fotos normales. El almacenamiento local es el disco duro de mi servidor.
- Las fotos en la tarjeta de anuncio ya están dadas del almacenamiento local.
- Las fotos se almacenan en el almacenamiento local durante varios días. Si durante este tiempo hubo escaneos, el período de almacenamiento local se extiende. Si no hubo vistas, las fotos se eliminan del almacenamiento local, pero permanecen en el nivel Cool en Azure.
- De Cool a Archive se copian si no hubo vistas durante dos meses: el objeto claramente no es popular y, en consecuencia, no tiene sentido pagar de más por el almacenamiento en Cool.
Primer lanzamiento
Cuando se escribió y probó el proceso, llegó el momento de la operación de prueba y se esperaban problemas. En la cola en ese momento había alrededor de 10 millones de objetos, decidí comenzar la migración de 30,000 objetos por día. Configurar hermosos gráficos en el tablero y comenzó a observar. En estadísticas, vi extrañas "estocadas" con las solicitudes de GetBlobProperties. Se producen con un intervalo aproximadamente igual de una hora, siempre comienzan aproximadamente una hora y media después del inicio de la migración y duran un tiempo después de su finalización.

El número de tales solicitudes era demasiado grande para ignorarlas. Miré los registros y vi que estas solicitudes no provienen de mi servidor sino de direcciones IP extranjeras. No quería pagar por ellos en absoluto.
Busqué en la pila y en la documentación, pero fue en vano. Escribió una
pregunta sobre Stackoverflow y soporte técnico. Como resultado, después de una larga correspondencia con el soporte técnico y de proporcionarles registros, me dijeron que pueden reproducir la situación y que esto es un error de su parte.
Un matiz interesante es que mi pregunta sobre Stackoverflow fue respondida no explicando las razones, sino solo confirmando que pagaré por estas solicitudes, pero la persona que dio la respuesta insistentemente me pidió que la marcara como correcta. También me insinuó de pasada que ellos (en apoyo) no son bienvenidos a difundir sobre los errores en sus propios productos. Le hago saber que no lo haré hasta que escriba la verdad. Podría escribir esto yo mismo, pero pensé que el personal de soporte técnico probablemente midió el número de respuestas confirmadas, así que le pedí que escribiera la verdadera razón y en este caso marco su respuesta como correcta. Después de algunas dudas, estuvo de acuerdo y complementó su comentario con un informe de error. En general, me gustó cómo funciona el soporte técnico: incluso me transfirieron a una chica rusa que todavía me mantiene al tanto de los cambios en este tema.
El hecho de que se reconociera el error solo me satisfizo moralmente, pero quería poner en funcionamiento el mecanismo y, al mismo tiempo, no pagar dinero por las solicitudes de zurdos. Especialmente teniendo en cuenta que normalmente me confundí para minimizar el número de solicitudes y, por lo tanto, el costo.
En soporte técnico, me aconsejaron que esperara con el lanzamiento y después de un par de semanas escribieron que el error se solucionó, pero cuando se publicará la solución, no se sabe. Ofrecieron habilitar el registro y trabajar así, y después del lanzamiento, solicitar una compensación en Microsoft. En realidad, en este modo, todavía funciona. Todos los días comienzo una migración de un pequeño número de objetos y espero el lanzamiento.
Conclusión
El costo de 30,000 objetos diarios sigue siendo 900 p. por mes, y esto es bastante aceptable. La mayoría de los gastos son operaciones de escritura. Entonces, cuando se procesa toda la cola y comienza la etapa de trabajo planificado, quedará claro cuál es el costo real de dicho almacenamiento. Pero según mis cálculos, esto sucederá en aproximadamente un año.
Cuando haya una versión en Azure Blob-storage, agregaré aquí si logré obtener una compensación. En cuanto a los gastos mensuales, esto es aproximadamente el 10% del costo.