2016-03-21 8 views
0

Der von mir entwickelte Webservice muss in maximal 6 Sekunden reagieren. Wenn der Webdienst in 6 Sekunden nicht antwortet, muss er mit einigen fest codierten Daten antworten.IIS/Azure IIS - maximale Reaktionszeit einschränken

Der Web-Service ist eine Art Proxy, der eingehende Daten transformiert und eine Anfrage an einen anderen Dienst stellt. Dieser Dienst ist ein Drittanbieter und kann zu lange ausfallen oder zu lange reagieren.

Gegenwärtig gibt es eine Einschränkung im Anwendungscode, der die Zeitüberschreitung für den Dienst eines Drittanbieters auf 3 Sekunden begrenzt (denken Sie daran, die Gesamtansprechzeit beträgt maximal 6 Sekunden).

Aber das Problem ist, dass die Anwendung sehr hoch geladen ist und manchmal nicht aktiviert ist, um ihren Code in Ruhe von 3 Sekunden auszuführen (aber ohne unseren App-Code in Millisekunden auszuführen, gibt es wirklich ein wenig Code). Ich glaube, dass Windows nicht aktiviert ist, um alle Threads auszuführen, und manchmal Threads für mehr als 3 Sekunden schlafen, und maximale Antwortzeit wird ohne die Möglichkeit, das zu umgehen, verletzt.

Die Anwendung wird in asp.net-Kern in C# und vollständig async entwickelt.

Also Frage: ist es möglich, Antwortzeit auf IIS-Ebene zu begrenzen? Ist es möglich, mit vordefinierten Daten zu reagieren, wenn eine Zeitüberschreitung aufgetreten ist? Gibt es eine Möglichkeit, Azure um zusätzliche Instanzen zu erweitern, um die Reaktionsfähigkeit zu verbessern? Gibt es einen programmatischen Weg, um Timeouts robust zu handhaben?

EDIT

Ich brauche

  1. Garantierte Reaktionszeit auf IIS mit hohen Last. Ist es überhaupt möglich auf Nicht-Echtzeit-Betriebssystemen?
  2. Wenn die Anfrage nicht rechtzeitig bearbeitet wird, senden Sie eine vordefinierte hartcodierte Antwort.
  3. dies selbst Für die Konfiguration
+1

Es klingt wie Sie müssen die Ressourcen für Ihre Azure-Instanz erhöhen und/oder zusätzliche Instanzen mit Lastenausgleich hinzufügen. Sie sollten wahrscheinlich auch in Ihrem Anwendungscode nach Leistungsengpässen suchen und diese beheben. – user1666620

Antwort

0

auf Azure tun, sind Sie beschränkt sich auf Minuten, die Sie als einfache Flucht genutzt haben könnte, aber du bist dies nicht in der Lage dies zu tun, würde ich denke, ich benutze etwas ähnliches wie die Enterprise Library Retry-Logik, das heißt, eine kleine Klasse machen, die ein Verfahren und ein Timeout-Wert nimmt:

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

    } 

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

    } 
} 

Sie können easilly diese Klasse mit einem Timer von einigen Arten implementieren, auch Asynchron/await mit (Ich habe diese aus Gründen der Einfachheit weggelassen)

Es wäre dann eine Sache, diese Methode des Aufrufs wie:

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

einige Optimierungen Dies muss, schreibe ich nur diesen Code aus der Spitze von meinem Kopf, aber gibt Ihnen eine allgemeine Vorstellung von meinem Vorschlag.