2015-10-31 14 views
9

Wir verwenden permanente Verbindungen und haben versucht, Verbindungen nach x Zeit zu erzwingen. Während ich sehe, können wir theoretisch ConnectionKeepAliveStrategy verwenden, was ich sagen kann, gilt das nur nach einer Antwort..i.e. während die Verbindung inaktiv ist.Apache HttpClient loadbalancing Poolverbindungen

Das Problem, das wir haben ..

Angenommen, 1 Client, Schlagen 2 Servern (A, B) über einen Loadbalancer. Wenn einer der Server offline geht (B), werden alle neuen Verbindungen auf dem Server (A) hergestellt. Wenn nun der andere Server (B) wieder online ist, bleibt er im Leerlauf, da alle Verbindungen auf dem anderen Server (A) sind. Solange der Client weiterhin auf eine Verbindung unterhalb des Leerlauf-Timeouts/Keepalives zugreift, wird dies fortgesetzt und der B-Server bleibt im Leerlauf (auch mit Null-Verbindungen).

Was wir tun wollen..zwingt, dass alle persistenten Verbindungen periodisch geschlossen werden (innerhalb eines 'randomisierten Zeitfensters'. Idealerweise wollen wir nicht, dass alle Verbindungen gleichzeitig zurückgesetzt werden). Irgendwelche Vorschläge dazu?

Wir versuchten zu erweitern HttpClientConnectionManager, und zu verfolgen, wie lange eine Verbindung offen für gewesen war, dann schließen Sie es nach x Menge Zeit ... aber das scheint nicht zu funktionieren. Ich vermute, das liegt daran, HttpClientConnection ist nicht tatsächlich die eigentliche Verbindung, sondern ist eher ein Proxy und sieht aus wie unter diesem Proxy, es ist tatsächlich "Verwendung" einer der etablierten Verbindungen, so macht es unmöglich, tatsächlich die Zeit zu verfolgen diese zugrunde liegenden Verbindungen wurden für.

Gedanken?

Gerade jetzt spiele ich mit der Idee, einfach zu rufen: auf 1 Verbindung pro Minute, nachdem wir eine Anfrage darauf ausgeführt haben, die ich denke, würde uns etwas näher an das gewünschte Verhalten bekommen.

+0

Haben Sie die Kontrolle über den Load Balancer? Vielleicht ist eine Lösung, sticky Sitzungen zu deaktivieren. – kuporific

+0

Es gibt keine sticky-Sitzungen, seine Round-Robbin..aber sobald die persistente Verbindung erstellt wird .. es bleibt..nachdem die persistenten Verbindungen periodisch geschlossen werden müssen, so dass der lb wieder über die Server loadbalance kann. – danomano

+0

Hatten Sie in diesem Szenario einen Durchbruch? Ich habe genau das gleiche Szenario, um nach soliden Ideen zu suchen, wie ich damit umgehen kann. – jagamot

Antwort

2

Mit TTL (time to live) kann die Gesamtlebensdauer einer Verbindung begrenzt werden.

HttpClientBuilder.create() 
     .setConnectionTimeToLive(1, TimeUnit.MINUTES) 
     .build(); 

Das wird dazu führen, dass alle Verbindungen nach einer Minute erneuert werden.

+0

Das würde funktionieren..aber es hat den Nachteil, dass, wenn Client X-Verbindungen zur gleichen Zeit etabliert..Es wird wahrscheinlich dazu führen, dass alle diese Verbindungen auf einmal fallen, und wieder hergestellt werden, nicht ideal. Die TTL innerhalb eines Zeitfensters randomisiert zu haben wäre ideal ... was ich versuche zu tun. – danomano

+0

Nein, wird es nicht. HttpClient löscht abgelaufene Verbindungen nicht proaktiv. Er verwirft abgelaufene Verbindungen passiv, wenn er eine Verbindung aus dem Pool mietet. – oleg

+0

hmm, nun an diesem Punkt lehne ich mich an meinen Hack von 1 Verbindung pro Minute abbrechen, oder so etwas. – danomano

3

Ich glaube nicht, dass Sie den Load Balancer ordnungsgemäß verwenden. Wenn Sie wie folgt verkabelt sind:

   +--> SA 
C <---> LB <--+ 
       +--> SB 

Der Client kann permanente Verbindungen zum Lastenausgleich haben. Die LB<-->SA und LB<-->SB Verbindungen können mit dauerhaften Verbindungen sein oder nicht, spielt keine Rolle. Der Load Balancer sollte HTTP und Route auf dieser Ebene verstehen und nicht nur TCP-Verbindungen. Somit können zwei eingehende (zu den LB) HTTP-Anforderungen auf derselben persistenten Verbindung zu zwei separaten Servern geroutet werden.

+0

In der Tat nehme ich an, dass die LB die LB -> (SA, SB) ein Zeitintervall zyklisch durchlaufen könnte, um sicherzustellen, dass, wenn SB verschwindet, es die Verbindungen SB Connections wieder aufbauen kann, sobald es zurückkommt) .. währenddessen würde der Klient das nicht bemerken. – danomano