it-swarm.com.ru

Функции Azure и кеширование

Мы планируем разработать функцию Azure, для которой входной триггер является сообщением служебной шины, а выходным будет хранилище больших двоичных объектов. Сообщение служебной шины будет содержать URL-адрес изображения, а функция изменит размер изображения до предварительно определенного разрешения и загрузит его в хранилище BLOB-объектов Azure.

Разрешение, к которому следует изменить размер изображения, сохраняется в базе данных, и функция Azure должна выполнить вызов базы данных, чтобы узнать разрешение, которое предполагается использовать для изображения во входном сообщении. Разрешение фактически будет основными данными, настроенными на основе источника входного сообщения.

Выполнение вызова из базы данных было бы дорогостоящим вызовом, поскольку для каждого вызова приходилось бы обращаться к базе данных. Есть ли способ кешировать данные и использовать их без вызова базы данных. Как в кешировании памяти?

9
Silly John

Вы можете использовать обычные подходы, которые вы использовали бы в других приложениях .NET:

  • Вы можете кэшировать его в памяти. Самый простой способ - просто объявить статический словарь и поместить значения базы данных внутрь (при необходимости используйте параллельный словарь). Кэшированные значения будут повторно использованы для всех последующих исполнений функций, которые выполняются в том же экземпляре. Если экземпляр простаивает в течение 5 минут или если приложение масштабируется до дополнительного экземпляра, вам придется снова прочитать базу данных;

  • Вы можете использовать распределенный кеш, например Redis, используя его SDK из кода функции. Может быть немного лучше, так как вы сохраняете природу функций без состояния, но может стоить немного дороже. Хранение таблиц является жизнеспособной альтернативой Redis, но с более ограниченным API.

В самих функциях Azure нет функции «кэширования», которую можно было бы использовать без дополнительного кода.

12
Mikhail Shilkov

Вы могли бы использовать Durable Functions и сделать вызов базы данных через действие или подчиненную оркестровку, тогда возвращаемое значение по существу кэшируется для вас и будет возвращаться без повторного выполнения базового вызова каждый раз, когда функция воспроизводится. 

4
Dennis

Вы можете использовать службу кэша Azure ( https://Azure.Microsoft.com/en-us/services/cache/ ) для кэширования ваших данных. По сути, в своей функции Azure вместо постоянного вызова базы данных вызывайте кэш Azure и используйте, если у него нет срока действия, и если он истек или не задан, то вызовите базу данных, чтобы получить значение, и заполните кэш соответствующей логикой истечения (тайм-аут после фиксированное время или какая-то другая логика).

2
user862268

Redis - это кэш в памяти, и для сохранения чистоты функции вы можете использовать пользовательскую привязку вывода:

[FunctionName("SetPoco")]
public static async Task<IActionResult> SetPoco(
    [HttpTrigger("POST", Route = "poco/{key}")] HttpRequest request,
    [Redis(Key = "{key}")] IAsyncCollector<CustomObject> collector)
{
    string requestBody;
    using (var reader = new StreamReader(request.Body))
    {
        requestBody = reader.ReadToEnd();
        var value = JsonConvert.DeserializeObject<CustomObject>(requestBody);
        await collector.AddAsync(value);
    }
    return new OkObjectResult(requestBody);
}

Ссылка на проект: https://github.com/daulet/Indigo.Functions#redis

Однако, если под кешем в памяти вы подразумеваете наличие в памяти функции, я настоятельно рекомендую иначе, так как функция подразумевает отсутствие состояния, и вы не сможете разделить эту память между несколькими хостами, на которых работает ваша функция. Это также не рекомендуется в рекомендации по использованию функций Azure

0
Daulet Zhanguzin

Рассмотрим что-то вроде Cloudfront или Cloudflare. Я не уверен, что именно предлагает Microsoft.

Это будет лежать поверх вашего API и кешировать запросы, а также распространять их по всему миру для вас.

Это может быть использовано в дополнение к любым другим решениям, представленным здесь, но это должен быть один из самых простых способов в еде 

0
Simon_Weaver