2016-03-19 13 views
2

Ich habe derzeit meine Webanwendung auf AWS gehostet, und ich verwende zwei ELB-Instanzen, eine zum Lastenausgleich der Frontend-Anforderungen an die App-Server, und eine zweite zum Lastenausgleich der Backend-Anforderungen von den App-Servern zu den API-Servern so (sorry für das crappy ascii-Diagramm):Können AWS ELB-Sticky-Sitzungen für Back-End-Anfragen verwendet werden?

  /-->APP1--\ /-->API1 
User-->ELB1   ELB2 
      \-->APP2--/ \-->API2 

Mit anderen Worten, dass die API-Anfragen der APP-Server macht, sind Last gleichmäßig über den beide Backend-API-Server ausgeglichen.

Da ich jedoch Antworten auf den API-Servern zwischenspeichern und einen Cache-Invalidierungsmechanismus verwenden, der NICHT zwischen den API-Servern freigegeben ist, möchte ich, dass die Sitzung eines Benutzers an einen Backend-API-Server gebunden wird.

Ich habe bereits die Sitzung des Benutzers an einen APP-Server gebunden, mit der normalen ELB Load Balancer-generierten Cookie-Stickiness, aber gibt es eine Möglichkeit, das Back-End-ELB an einer Sitzung festhalten? Natürlich kommen diese Anfragen nicht von einem Browser, also gibt es nichts, um Cookies zu verwalten, und es scheint, dass ELBs nur die Klebrigkeit mit Cookies verwalten können. Kann ich die notwendigen Cookies meiner Backend-Anfragen emulieren?

Antwort

1

Um diese Frage zu schließen, ist dies ziemlich einfach zu erreichen, indem einfach der Antwort-Header 'Set-Cookie' vom ELB erfasst und das Cookie anschließend in nachfolgenden Anfragen zurückgegeben wird. Aber siehe meine Einschränkung unten.

0

Ich glaube nicht, dass es möglich wäre, Klebrigkeit zwischen Ihren App-Servern und API-Servern zu erreichen, ohne eine ganze Menge unordentlicher Arbeit zu erledigen. Ich könnte mich irren und bin sehr offen für Korrekturen, aber ich glaube nicht, dass es eine einfache Lösung gibt, es sei denn, die Sprache, die Sie für Ihre App Server-Logik verwenden, hat etwas zu bieten.

Unabhängig davon wäre die beste Lösung hier, Ihre App Server und Ihren Cache zu entkoppeln. Es wäre sinnvoller, wenn ein einzelner Cache zwischen den API-Servern geteilt wird, die von separaten Servern bedient werden. Dadurch erhöht sich die Fehlertoleranz Ihrer Infrastruktur und Sie erhalten bessere Daten in Ihrem Cache (insbesondere beim Hochskalieren). Sie können den Service ElastiCache verwenden, um dies für Sie zu tun und schwere Lasten zu vermeiden.

+0

Es erwies sich als ziemlich einfach. Ich erfasse nur den Antwortkopf "Set-Cookie" und speichere jeden AWSELB-Cookie, den ich erhalte, und sende den Cookie dann in nachfolgenden Anfragen. Die APP-Sitzung ist jetzt an eine API-Instanz gebunden. – SilentMiles

+0

Aber nur ein Wort der Vorsicht: Wenn Sie eine kleine Anzahl von Front-End/Back-End-Servern haben, ist es möglich, dass alle Front-End-Server nur an einen oder nur wenige Back-End-Server hängen bleiben. Mit anderen Worten, diese Methode reduziert die Fähigkeit des Load-Balancers, Lasten dynamisch auszugleichen. – SilentMiles

+0

Dies ist in der Dokumentation klar umrissen. Klebrige Sitzungen behindern die Skalierbarkeit erheblich. – mickzer