Веб-роль Azure — максимальное количество исходящих http-подключений

Я создаю веб-роль Azure, которая должна будет вызывать множество внешних веб-служб.

Я помню, что для ASP.Net 1.1 было максимальное ограничение по умолчанию, равное 2, которое вы могли настроить, если вашему приложению требовалось больше (что было довольно низким, если честно). Я полагаю, что в ASP.Net 2.0 они повысили это значение, и рекомендовалось увеличить количество ядер в 12 раз.

Каковы ограничения и средства их настройки для веб-ролей Azure? У меня будут сотни или тысячи одновременных исходящих запросов. Означает ли это, что мне нужны инстансы большего размера (больше ядер), или я могу сделать это, используя больше инстансов «Extra Small» и правильно настроив их (даже если это означает 12 на сервер)?

Спасибо.


person Pittsburgh DBA    schedule 14.09.2012    source источник


Ответы (1)


Размер вашего экземпляра будет определять только пропускную способность, которая будет зарезервирована для вашего экземпляра (XS — 5 Мбит/с, дополнительная информация здесь). Что вам нужно сделать, так это просто изменить DefaultConnectionLimit на более чем 2:

  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="12"/>
    </connectionManagement>
  </system.net>

Добавьте это в свой web.config, если вы хотите разрешить это в своем веб-приложении. Добавьте следующее в свой WebRole.cs, если вы хотите вызывать службы перед запуском своего экземпляра, например:

    public override bool OnStart()
    {
        ServicePointManager.DefaultConnectionLimit = 12;
        return base.OnStart();
    }

Имейте в виду, что даже если запросы поставлены в очередь, общая производительность будет выше, если вы будете вызывать веб-службы асинхронным способом. Вот очень простой пример (при условии, что вы вызываете простую службу REST, клиентские прокси-серверы WCF лучше поддерживают асинхронные запросы):

<%@ Page Async="true" ... %>

public partial class AsyncPage : System.Web.UI.Page
{
    private WebRequest req;

    void Page_Load (object sender, EventArgs e)
    {
        AddOnPreRenderCompleteAsync (
            new BeginEventHandler(BeginWebServiceCall),
            new EndEventHandler (EndWebServiceCall)
        );
    }

    IAsyncResult BeginWebServiceCall (object sender, EventArgs e, 
        AsyncCallback cb, object state)
    {
        req = WebRequest.Create("http://some.webs.service/rest/api");
        return req.BeginGetResponse (cb, state);
    }
    void EndWebServiceCall (IAsyncResult ar)
    {
        using (var response = req.EndGetResponse(ar))
        {
            using var reader = 
                new StreamReader(response.GetResponseStream()))
            {
                var text = reader.ReadToEnd();
        ...
            }
        }
    }
}
person Sandrino Di Mattia    schedule 14.09.2012
comment
Большое тебе спасибо! Страница, на которую вы ссылаетесь, также показывает, сколько ядер мы получаем для каждого размера экземпляра. В какой-то момент, когда слишком много исходящих подключений, не будет ли XS перегружен? Например, Medium с 2 ядрами в прошлом был бы настроен на maxconnection=24. Разве это не рекомендация для Azure? Интересно, сколько может выдержать XS. - person Pittsburgh DBA; 14.09.2012
comment
Я предлагаю вам начать с 12 на экземпляре XS (маленький будет даже лучше, так как вы получите выделенное ядро) и провести стресс-тестирование, чтобы увидеть, как он реагирует. Но имейте в виду, что вы получите лучшие результаты, если будете вызывать веб-сервисы с помощью асинхронных запросов (я обновил свой ответ). - person Sandrino Di Mattia; 14.09.2012
comment
Вау! Это отличный материал. Спасибо. - person Pittsburgh DBA; 14.09.2012
comment
И это отличный ресурс для изучения асинхронных запросов: stackoverflow.com/questions/9453560/ - person Sandrino Di Mattia; 14.09.2012