2016-03-21 3 views
0

Веб-сервис, который я разрабатываю, должен отвечать через 6 секунд макс. Если веб-служба не отвечает на запросы через 6 секунд, она должна ответить на некоторые жестко запрограммированные данные.IIS/Azure IIS - ограничение максимального времени отклика

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

В настоящее время существует ограничение в коде приложения, которое ограничивает время ожидания стороннего обслуживания до 3 секунд (помните, что общее время ответа составляет 6 секунд).

Но проблема заключается в том, что приложение имеет очень высокую нагрузку, и иногда он не может выполнить свой код за 3 секунды (но без загрузки нашего кода приложения выполняется в миллисекундах, на самом деле кода немного). Я считаю, что Windows не может запускать все потоки, а иногда потоки спят более 3 секунд, а максимальное время ответа нарушается без возможности справиться с этим.

Приложение разработано в ядре asp.net в C# и полностью async.

Итак, вопрос: возможно ли ограничить время отклика на уровне IIS? Возможно ли ответить с предопределенными данными, если произошел тайм-аут? Есть ли способ, кроме добавления дополнительных экземпляров в Azure для улучшения реагирования? Существует ли программный способ эффективного использования тайм-аутов?

EDIT

Мне нужно

  1. Гарантированное время отклика на IIS с высокой нагрузкой. Возможно ли это вообще в ОС без реального времени?
  2. Когда запрос не обрабатывается вовремя, отправьте предопределенный жесткий код.
  3. ли это на Azure
+1

Похоже, вам нужно увеличить ресурсы, доступные для вашего лазурного экземпляра, и/или добавить дополнительные экземпляры с балансировкой нагрузки. Вероятно, вы также захотите найти какие-либо узкие места производительности в вашем коде приложения, а также обратиться к ним. – user1666620

ответ

0

Для самой конфигурации, вы ограничены до нескольких минут, которые вы могли бы использовать в качестве простого побега, однако, вы не в состоянии сделать это, так что я думаю, я хотел бы использовать нечто похожее на Enterprise Library Retry Logic, то есть, сделать небольшой класс, который принимает метод и значение времени ожидания:

public class TimeRestrictor{ 
    public bool InvokeAction(Action action, TimeSpan timeout){ 

    } 

    public Tuple<bool, T> InvokeFunction<T>(Func<T> function, TimeSpan timeout){ 

    } 
} 

Вы можете easilly реализовать этот класс с таймером некоторых видов, а также с использованием асинхронного/Await (Я оставил их для простоты)

тогда было бы дело вызвать этот метод, как:

var ranInTime = timeRestrictor.InvokeAction(MyMethod, TimeSpan.FromSeconds(6)); 
if(!ranInTime){ 
    SetTimeOutResult(); 
} 

Это нуждается в некоторой настройке, я просто пишу этот код у верхней части моей головы, но дает общее представление о моем предложении.

 Смежные вопросы

  • Нет связанных вопросов^_^