2016-05-14 28 views
2

Um OOME in einem riemann Server zu verhindern, wenn Clients ACKs nicht korrekt lesen, habe ich some logic implementiert, um den Kanal zu schließen, wenn es nicht beschreibbar wird, unter der Annahme, dass der Client Pakete nicht schnell genug liest/ACKing.Wie Netty Server mit langsamen Client Drossel?

Dies schließt jedoch auch den Kanal beim Senden von Abfragen mit großer Abfrage, wahrscheinlich weil der Server versucht, das Ergebnis schneller zu schreiben, als es über TCP gesendet werden kann. Aus der Spitze meines Kopfes würde ich denken, dass der beste Weg, um mit dieser Situation umzugehen, wäre, eine Zeitüberschreitung beim Schreiben zu setzen, unter Verwendung eines WriteTimeoutHandler.

Gibt es in netty ein Standardmuster, das diesen Fall behandelt?

+0

Sieht aus wie diese Frage verwandt ist: http://stackoverflow.com/questions/28862613/throttling-websockets-with-netty-socketio-server – insitu

Antwort

1

Im Grunde würden Sie aufhören zu schreiben, sobald Channel.isWritable() false zurückgibt und erneut zu starten, sobald es wieder wahr zurückgibt. Sie können durch das Update davon benachrichtigt werden, indem Sie ChannelInboundHandler.channelWritabilityChanged(...) überschreiben.

+0

Danke für den Vorschlag, das ist etwas, was ich im Sinn hatte, aber das scheint ziemlich kompliziert in diesem speziellen Fall, da ich einige Logik handhaben muss, um zu wissen, welche Art von Antworten nicht geschrieben werden. Gibt es eine Möglichkeit, Antworten im Ausgabepuffer zu verwerfen? Ich fürchte, es gibt keine praktische Lösung für das, was ich tun möchte ... – insitu