0

Ich habe eine OWIN-API-Farm, die von einer Azure-Worker-Rolle gehostet wird. Anscheinend werden Anforderungen an diese Rolle nicht ordnungsgemäß roundrobined.Wie kann ich sicherstellen, dass mein WebRequest-Client nicht bei einem bestimmten Server in einer Webfarm bleibt?

Konkret habe ich eine anständige Anzahl von C# -basierten Agenten, deren Anfragen an eine Instanz innerhalb der Rolle zu "kleben" scheinen und nicht robotiert werden. Ich vermute, dies ist ein Problem auf der Client-Seite dieser Agenten. Da meine Agenten meine Arbeiterrolle jede Minute ein paar Mal aufrufen, ist das ein großes Problem.

Hier ist der Code, der meine Worker Role aufruft (dies ist eine GET-Methode, es gibt eine ähnliche POST-Methode). Kann ich irgendetwas tun, um sicherzustellen, dass Verbindungen zu bestimmten Instanzen nicht bestehen?

var client = WebRequest.Create(url); 
client.Headers.Add("Authorization", string.Format("Bearer {0}", token.AccessToken)); 
client.Headers.Add("AccountId", accountId.ToString()); 
client.Timeout = 120000; 
client.Method = "GET"; 

using (var response = client.GetResponse()) 
{ 
    using (var stream = response.GetResponseStream()) 
    { 
     if (stream == null) return default(T); 

     using (var reader = new StreamReader(stream)) 
     { 
      var data = reader.ReadToEnd(); 
      return JsonConvert.DeserializeObject<T>(data); 
     } 
    } 
} 

Antwort

0

Ihren Lastausgleichsmodus prüfen: Klebrigkeit kann auf 2-Tupels konfiguriert werden (Quelle, dest), 3-Tupels (Quelle, dest, port) oder keine/keine Klebrigkeit, die mit 5-Tupel entsprechen (Quell-IP, Quell-Port, Ziel-IP, Ziel-Port, Protokolltyp). Der Standardwert ist kein/5 Tupel.

Für eine Cloud können Sie überprüfen/ändern die Config ist die .csdef Datei hier ein Beispiel:

<Endpoints> 
<InputEndpoint name="input-endpoint-name" loadBalancerProbe="load-balancer-probe-name" loadBalancerDistribution="sourceIP" protocol="[http|https|tcp|udp]" localPort="local-port-number" port="port-number" certificate="certificate-name" /> 
</Endpoints> 

Dies ist die komplette Info: https://azure.microsoft.com/en-us/documentation/articles/load-balancer-distribution-mode/

+0

Ich verwende keine/default Igorek

0

Azure Websites über eine Funktion namens Anwendungsanforderungen haben Routing (ARR) -Affinität, die Sitzungen zwischen dem Client und der Instanz der Website, mit der er verbunden ist, festlegt, indem er dem Client ein Cookie zur Verfügung stellt, das die Identifikation für diese Website-Instanz codiert. Alle nachfolgenden Anfragen des Clients werden an diese ursprüngliche Website-Instanz geleitet.

ARR kann manchmal nützlich sein, führt aber zu "Stehvermögen" und begrenzt die Skalierbarkeit des Systems, da Clients an eine bestimmte Website-Instanz gebunden werden. Dies ist besonders problematisch, wenn die Instanz, mit der der Client ursprünglich verbunden war, fehlgeschlagen ist!

Es ist möglich, ARR für Websites zu deaktivieren web.config durch Modifizieren eines Arr-Disable-Session-Affinity benutzerdefinierten Header senden:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Arr-Disable-Session-Affinity" value="True" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 
+0

Keine Verwendung von Websites, aber die Verwendung einer Worker Role – Igorek

+0

Ich habe dies nicht mit Webrollen versucht, aber seit Webrollen verwenden IIS, Sie möchten es trotzdem versuchen und die Datei web.config ändern. Ich wäre nicht überrascht, wenn es funktioniert hätte. Bitte lassen Sie mich wissen, ich bin neugierig, es herauszufinden. –

+0

Ja, wie ich bereits erwähnt habe, Web-Rollen nicht laufen, ist die Web-API eine OWIN-basierte, außerhalb von IIS in einer Worker ROle – Igorek