Azure — FetchAttributes против Табличное хранилище метаданных изображения

#c# #azure

#c# #azure

Вопрос:

У меня есть несколько тысяч изображений известных произведений искусства, хранящихся в хранилище контейнеров Azure. С каждым изображением связана некоторая информация об оформлении, например, название, исполнитель, год и т.д. В настоящее время эта информация хранится в табличном хранилище Azure, где я выполняю поиск на основе идентификатора изображения. Однако было бы лучше (с точки зрения производительности и наилучшей практики) сохранить эту информацию в виде данных атрибута для изображения, а затем вызвать?:

 var myAttributes = myBlockBlob.FetchAttributesAsync();
  

Вот текущий способ, которым я это делаю, используя извлечение таблицы Azure:

 var myGetOperation = TableOperation.Retrieve<TileInfoEntity>("0", imageID);
var myResult = await myTable.ExecuteAsync(myGetOperation);
  

Заранее спасибо.

Ответ №1:

Необязательно существует правильный или неправильный способ обработки метаданных содержимого — вы можете хранить их где угодно.

Просто имейте в виду: хранилище больших двоичных объектов не предоставляет инструментов запроса метаданных, поэтому нет простого способа работы с метаданными, кроме прямого чтения метаданных конкретного большого объекта.

Системы хранения, такие как табличное хранилище, допускают запросы на основе раздела и / или ключа строки, предоставляя различные типы данных, обеспечивая операции CRUD и т.д. То же самое с любым другим ядром базы данных, поскольку все они предоставляют некоторый тип поддержки индексации / запросов.

Ответ №2:

Единственное, что быстрее, чем извлечение из табличного хранилища, зная ключ строки ключ раздела, — это разогреть кэш Redis со всеми метаданными и извлечь из него.

 cache.StringSet("key1", "value1");
string value = cache.StringGet("key1");
  

Честно говоря, я не думаю, что прирост производительности будет значительным, если мы не говорим о количестве запросов не менее 1 тыс. в секунду.

Кэш вывода в режиме ядра IIS также является хорошим кандидатом, если ваши запросы правильно сформированы (т. Е. Выглядят как статический объект).

 <system.webServer>
    <caching>
        <profiles>
            <add extension=".metadata" policy="CacheForTimePeriod"
             duration="00:00:55" varyByHeaders="Accept-Language" />
        </profiles>
    </caching>                  
</system.webServer>
  

Знайте, где находится ваше узкое место — не оптимизируйте то, на что не указывает ваша телеметрия.