Мы находимся в процессе переноса локального приложения в облако Azure. Внутренние корпоративные пользователи регулярно загружают полноразмерные изображения через интерфейс администратора на наш веб-сайт (теперь они будут отправляться в хранилище BLOB-объектов Azure). Сайт несет ответственность за создание изображений правильного размера по запросу. Итак, что происходит прямо сейчас (в локальной среде):
1) Пользователь загружает полноразмерный файл.
2) Когда уменьшенная версия запрашивается через обработчик HTTP GetImage (т.е. http://www.site.com/GetImage.aspx?imageid=15&height=100&width=100) обработчик проверяет, создавали ли мы ранее версию этого изображения такого размера. Если это так, он записывает его непосредственно в поток ответов. Если нет, требуется секунда, чтобы изменить его размер, сохранить его в каталоге «/iamges/cache» и записать измененный размер изображения в поток ответов.
3) В следующий раз, когда этот файл запрашивается в этом размере, он возвращает ранее созданное изображение.
Поэтому я хочу реализовать механизм того же типа, используя Azure и хранилище BLOB-объектов, но у меня есть несколько проблем:
1) Я не могу просто проверить, существует ли капля. Я должен сначала загрузить большой двоичный объект, а затем вызвать FetchAttributes, чтобы узнать, выдает ли он исключение. Однако это фактически загружает изображение. Так не удваивает ли это количество запросов на изображения (один, чтобы увидеть, существует ли он, и другой, чтобы показать пользователю)?
2) Допустим, изображения нужного мне размера не существует (т. е. блоб /images/cache/image_15_100_100.jpg не существует — id #15, 100x100 пикселей). Итак, я однажды отправил запрос в CDN, чтобы узнать, существует ли он. Теперь мне нужно загрузить, возможно, полноразмерное изображение размером 5-10 МБ (в отличие от быстрого чтения из нашей локальной файловой системы), загрузить это изображение размером 5-10 МБ в память, изменить его размер и повторно загрузить его в CDN. Это требует много времени, особенно когда я могу получить 10-15 таких изображений по одному запросу.
Я знаю, что Azure является относительно новым продуктом, но есть ли что-то близкое к «наилучшей практике» для такого типа взаимодействия с хранилищем BLOB-объектов? Есть ли другой подход, который я мог бы рассмотреть? Это просто кажется большим количеством накладных расходов для изменения размера изображения, поэтому я полагаю, что должен что-то упустить или упустить из виду другое решение.