2016-04-25 9 views
1

Ich habe Probleme über mehrere Umgebungen (dh unterschiedliche Azure Redis Instanzen) ähnlich zu diesem Beitrag: ServiceStack.Redis: Unable to Connect: sPort:ServiceStack.Redis Verbindungsprobleme mit Azure Redis

Aber natürlich können wir nicht redis Servern verschieben oder ändern, da wir abhängig sind Azure Redis. Wenn es sich um ein Latenzproblem handelt, sind wir vielleicht ...

Wir haben eine ältere Version von SS (4.0.42.0) verwendet und seitdem auf den neuesten Stand gebracht (4.0.56.0) und sehen die gleichen zeitweiligen Probleme.

Hier ist ein Hintergrund: - Das Problem tritt erst nach mindestens 2K Anfragen (manchmal mehr oder weniger). Ja, wir verwenden die neueste SS-Lizenz. - Es ist sehr intermittierend, die meisten Anfragen sind erfolgreich, aber diejenigen, die fehlschlagen, scheitern in der Regel in kleinen Mengen (1-5 oder so), dann verschwindet das Problem für eine Weile - Ich habe RedisPoolManager, PooledRedisClientManager mit den gleichen Ergebnissen versucht. - Ich habe einen Client-Statistik-Bericht für jede Anfrage erstellt und sichergestellt, dass der Pool genügend Clients enthält, keine sind fehlerhaft usw. Selten sehe ich mehr als 2-3 Clients zu einer Zeit von 40. -

Verschiedene Ausnahmen: - IOException mit Nachricht Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host und ein Stacktrace, das eine Erwähnung von RedisClient enthält. Hier ist die vollständige Fehler dump:
"exception": { "message": "Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.", "source": "System", "targetSite": "Int32 Read(Byte[], Int32, Int32)", "stackTrace": " at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)\r\n at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)\r\n at System.Net.Security._SslStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security._SslStream.StartReading(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security._SslStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslStream.Read(Byte[] buffer, Int32 offset, Int32 count)\r\n at System.IO.BufferedStream.ReadByte()\r\n at ServiceStack.Redis.RedisNativeClient.ReadLine()\r\n at ServiceStack.Redis.RedisNativeClient.ReadData()\r\n at ServiceStack.Redis.RedisClient.<>c__DisplayClass1c 1.b__1b (RedisClient r) \ r \ n bei ServiceStack.Redis.RedisClient.Exec [T] (Func 2 action)\r\n at ServiceStack.Redis.RedisClientManagerCacheClient.Get[T](String key)\r\n at API.ServiceInterface.RequestExtensions.GetUserSession(IRequest req, Boolean createIfNotExists) in F:\\src\\CCCAPI CD (DevLab)\\ServiceInterface\\Extensions\\RequestExtensions.cs:line 26\r\n at API.WebHost.AuthImpl.HandleBlacklistedUserSessions(IRequest req, IResponse httpResponse) in F:\\src\\CCCAPI CD (DevLab)\\WebHost\\Authentication\\AuthImpl.cs:line 30\r\n at ServiceStack.ServiceStackHost.ApplyPreRequestFilters(IRequest httpReq, IResponse httpRes)\r\n at ServiceStack.Host.RestHandler.ProcessRequestAsync(IRequest httpReq, IResponse httpRes, String operationName)", "type": "IOException", "innerException": { "message": "An existing connection was forcibly closed by the remote host", "source": "System", "targetSite": "Int32 Read(Byte[], Int32, Int32)", "stackTrace": " at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)", "type": "SocketException" } }

-Ein weiterer Ausnahme, die wir sehen, ist Ausnahme Typ ServiceStack.Redis mit Meldung Unable to Connect: sPort: 50447 (das interessante daran ist, dass die Port-Änderungen, und ist nie die wirkliche Azure Redis SSL-Port, der verwendet werden soll, ist es wie der Pool-Manager scheint vielleicht nicht die richtige zu diesem Client übergeben?) hier ist die vollständige Dump.: "exception": { "message": "Unable to Connect: sPort: 50447", "source": "ServiceStack.Redis", "targetSite": "ServiceStack.Redis.RedisException CreateConnectionError()", "stackTrace": " at ServiceStack.Redis.RedisNativeClient.CreateConnectionError()\r\n at ServiceStack.Redis.RedisNativeClient.SendExpectData(Byte[][] cmdWithBinaryArgs)\r\n at ServiceStack.Redis.RedisClient.<>c__DisplayClass1c 1.b__1b (RedisClient R) \ r \ n bei ServiceStack.Redis.RedisClient.Exec [T] (Func 2 action)\r\n at ServiceStack.Redis.RedisClientManagerCacheClient.Get[T](String key)\r\n at API.ServiceInterface.RequestExtensions.GetUserSession(IRequest req, Boolean createIfNotExists) in F:\\src\\CCCAPI CD (DevLab)\\ServiceInterface\\Extensions\\RequestExtensions.cs:line 26\r\n at API.WebHost.AuthImpl.HandleBlacklistedUserSessions(IRequest req, IResponse httpResponse) in F:\\src\\CCCAPI CD (DevLab)\\WebHost\\Authentication\\AuthImpl.cs:line 30\r\n at ServiceStack.ServiceStackHost.ApplyPreRequestFilters(IRequest httpReq, IResponse httpRes)\r\n at ServiceStack.Host.RestHandler.ProcessRequestAsync(IRequest httpReq, IResponse httpRes, String operationName)", "type": "RedisException", "innerException": { "message": "An existing connection was forcibly closed by the remote host", "source": "System", "targetSite": "Void Write(Byte[], Int32, Int32)", "stackTrace": " at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)", "type": "SocketException" }

im mit dieser einer kämpfen ... jede Hilfe würde geschätzt werden.

Antwort

2

Eine bestehende Verbindung wurden vom Remote-Host

wird

geschlossen wurde ein allgemeiner TCP Netzwerkfehler der Verbindung anzeigt, von der Fern redis Instanz oder möglicherweise fehlerhafter Netzwerk-Hardware getötet wurde, gibt es nichts, was verhindern kann, Es passiert auf dem Client, aber die Auswirkungen davon sollten mit ServiceStack.Redis Automatic Retries Funktion gemildert werden.

Verbindung nicht möglich: Sport: 50447

der Sport (Quelle) zu dem clientPort bezieht, dh den TCP-Port zufällig auf dem Client ausgewählt für die TCP-Verbindung hergestellt wird, es bezieht sich nicht auf den (Ziel-) Port des Servers, der in der Verbindungszeichenfolge angegeben ist.

Der Fehler ist ein Hinweis darauf, dass das Redis-Client versucht, eine neue TCP-Verbindung aufzubauen, aber abgelehnt wurde. Es gibt nichts, was der Kunde tun kann, sondern es wiederholt.

das Problem Da erscheint häufiger nach einiger Last kann es sich um ein Ergebnis des Servers sein wird, in dem Fall übersättigten können Sie versuchen, die Größe des Azure Redis Cache zu erhöhen Sie verwenden.

Ich habe bemerkt, dass diese unregelmäßigen Probleme auf Azure viel mehr passieren als anderswo (nicht klar, wenn es wegen der Popularität oder Unzuverlässigkeit ist), redis ist normalerweise felsenfest in seiner natürlichen Umgebung, dh unter Linux und Zugriff aus dem gleichen Subnetz. Eine andere Lösung, die Sie versuchen können, besteht darin, einen Redis-Server auf einer Linux-VM im selben Datencenter auszuführen, von dem aus er aufgerufen wurde. Dadurch werden möglicherweise Einschränkungen oder andere vom verwalteten Azure Redis-Dienst hinzugefügte Einschränkungen umgangen.

+0

Nicht, was ich gehofft hatte, da wir so an Azure gefesselt sind - ich habe das Auto Retry Timeout auf einen absurden Wert (20s) erhöht und hoffe, dass das ausreicht, um die Auswirkungen dieser Probleme vorübergehend zu mildern. Wenn es sich wirklich um ein serverseitiges Problem handelt, finde ich es merkwürdig, dass es keine Berichte gibt, die uns darauf aufmerksam machen, dass es ein Drosselung/Fehler/Lade-Problem gibt. Wir haben bereits versucht, die Kapazität der Azure Redis-Instanzen weit über das hinaus zu erhöhen, was wir brauchten - ohne Glück. Vielen Dank für die klare Erklärung. Wir werden in Erwägung ziehen, ein Ticket mit Azure zu hinterlegen. – jglassco

+1

Ein Follow-up zu diesem Problem: Ich habe Azure ein Support-Ticket gesendet - sie haben zugegeben, dass ein Problem mit Azure Redis und dem ServiceStack-Client vorliegt. Das Cache-Support-Team hat unsere Redis-Instanzen manuell gepatcht und das Problem ist verschwunden. Ich würde mir vorstellen, dass sie diesen Patch in naher Zukunft automatisch einfügen werden, aber jetzt müssen wir es anfordern (für Standard-Instanzen hatte Premium bereits den Patch, anscheinend). – jglassco

+0

@jglassco Tolles Thx für die Folge. Ich gehe davon aus, dass der gemanagte Redis-Dienst seinen Windows-Port ausführt, nicht ideal, da Redis am besten unter Linux läuft. – mythz

Verwandte Themen