Я возникли проблемы в нескольких средах (т.е. различные экземпляры Azure Redis), похожие на это сообщение: ServiceStack.Redis: Unable to Connect: sPort:вопросы ServiceStack.Redis связи с Azure Redis
Но, конечно, мы не можем переместить или изменить REDIS серверов, так как мы зависим от Лазурный Редис. Если это проблема с латентностью, мы могли бы быть завинчены ...
Мы использовали более старую версию SS (4.0.42.0) и с тех пор обновлялись до последней версии (4.0.56.0) и видим те же проблемы с прерывистой ситуацией.
Вот некоторые фон: - Проблема возникает только после того, как по крайней мере 2K запросов (иногда более или менее). Да, мы используем новейшую лицензию SS. - Это очень прерывисто, большинство запросов успешны, но те, которые терпят неудачу, обычно терпят неудачу в небольших пучках (1-5 или около того), тогда проблема исчезает некоторое время. - Я пробовал RedisPoolManager, PooledRedisClientManager с теми же результатами. - Я сделал отчет о статистике клиентов для каждого запроса и убедился, что в пуле есть достаточные клиенты, ни одна из них не является ошибкой и т. Д. Редко я вижу более 2-3 клиентов, используемых в момент времени из 40. -
Различные Исключения: - IOException
с сообщением Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host
и стек, который включает упоминание о RedisClient. Вот полный дамп ошибки:
"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 г) \ г \ п на 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" } }
-Еще исключение мы видим исключение типа ServiceStack.Redis
с сообщением Unable to Connect: sPort: 50447
(интересно, что порт меняется и никогда не является настоящим портом SSL Azure Redis, который должен использоваться, кажется, что диспетчер пула не может передать правильный ему этот клиент?). Вот полный дамп: "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 г) \ г \ п на 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 борется с этим ... любая помощь будет оценена по достоинству.
Не то, на что я надеялся, так как мы надеваем наручники на Azure - я увеличил тайм-аут Auto Retry до абсурдного значения (20 с) и надеюсь, что этого достаточно, чтобы временно смягчить влияние этих проблем. Если это действительно проблема на стороне сервера, мне показалось странным, что не сообщается об отчетности, чтобы предупредить нас о том, что есть проблема с дросселированием/ошибкой/загрузкой. Мы уже пытались увеличить возможности экземпляров Azure Redis далеко за пределами того, что нам было нужно - без везения. Благодарим вас за четкое объяснение. Мы рассмотрим вопрос о подаче билета с Azure .. – jglassco
. Следуйте за этой проблемой: я подал заявку на поддержку Azure - они признали, что есть проблема с Azure Redis и клиентом ServiceStack. Команда поддержки кеша исправила наши экземпляры redis вручную, и проблема исчезла. Я бы предположил, что они будут включать этот патч автоматически в ближайшем будущем, но на данный момент мы должны его запросить (для стандартных экземпляров у Premium уже был патч, по-видимому). – jglassco
@jglassco Отличный thx для последующей работы. Я предполагаю, что управляемая служба Redis работает под управлением своего порта Windows, а не идеальна, так как Redis работает лучше всего на Linux. – mythz