Облачные службы Azure: поддержка ссылок на объекты для разных запросов - PullRequest
2 голосов
/ 24 мая 2019

У меня есть (классический) облачный сервис, который должен создать дорогой объект, который я хочу использовать в последующих запросах.Создание занимает много времени, поэтому его создание каждый раз замедляет недопустимо замедление запросов.

public class MyService : IHttpHandler
{
    public static ExpensiveObject MyObject;

    public void ProcessRequest(HttpContext context)
    {
        if (MyObject == null) 
            MyObject = new ExpensiveObject();  // very time consuming operation

        // do stuff with MyObject
    }
}

(я понимаю, что не учитывается одновременное выполнение нескольких одновременных запросов, не обращайте на это внимания) Когда я публикую два запроса,один за другим каждый раз создается новый MyObject.Как я могу гарантировать, что он повторно использует один и тот же объект, созданный для каждого запроса?

Установка IsReusable для возврата true в MyService, по-видимому, не имеет значения.

Ответы [ 3 ]

1 голос
/ 24 мая 2019

Похоже, вам нужно переместить общий объект из HttpHandler в отдельную размещенную службу, например, службу приложений Azure, веб-задание Azure (подходит не для всех сценариев использования) и т. Д.

Сценарий службы приложений Azure : веб-приложение связывается со службой приложений по HTTP (см. HttpClient ). Служба приложений Azure имеет параметр конфигурации Всегда включен , который сохраняет приложение загруженным, даже когда трафика нет.

Если вы имеете дело с длительной операцией (хотя вы писали, что проблема заключается в длительной инициализации), тогда имеет смысл взглянуть на стандартный шаблон REST, решающий такие проблемы - Опрос .

Может быть, эта ссылка будет вам полезна: Распространенные причины перезапуска ролей облачной службы .

1 голос
/ 24 мая 2019

Если вы работаете внутри IIS , вы не можете .Пул приложений на работе.Кроме того, несколько запросов обычно не пересекаются в процессе обработки.

Типичные параметры включают следующее.Он создаст только одну дорогостоящую службу для потока:

  1. IoC, регистрирующий жизненный цикл службы для потока (или области запроса).
  2. синглтон (пул приложений уже используется)

- Удачи!

0 голосов
/ 27 мая 2019

Чтобы достичь этого легко (не имея дело с тайной чушью Azure), я просто создал отдельный исполняемый файл, в котором размещается ExpensiveObject на локальном сервере Nancy (запущен в сценарии запуска).

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

...