2016-04-25 2 views
1

Я возникли проблемы в нескольких средах (т.е. различные экземпляры 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 борется с этим ... любая помощь будет оценена по достоинству.

ответ

2

Существующее соединение было принудительно закрыто удаленным узлом

Это общая ошибка TCP сети указывает на соединение был убит удаленного экземпляра Redis или потенциально неисправного сетевого оборудования, нет ничего, что может помешать это происходит на клиенте, но последствия этого должны быть смягчены с помощью ServiceStack.Redis Automatic Retries.

Невозможно подключиться: СПОРТИВНЫЕ: 50447

к спорту (источник) относится к clientPort, то есть TCP порт выбранного случайным образом на клиенте для установления соединения TCP, он не относится к порт (целевого) сервера, который указан в строке подключения.

Ошибка - это указание, что клиент Redis пытается установить новое TCP-соединение, но ему было отказано. Клиент ничего не может сделать, но продолжать повторять.

Учитывая, что проблема возникает чаще после некоторой загрузки, это может быть результатом перенасыщения сервера, и в этом случае вы можете попытаться увеличить размер кэша лазурного кэша, который вы используете.

Я заметил, что эти прерывистые проблемы, похоже, происходят гораздо чаще на Azure, чем где-либо еще (непонятно, связано ли это с популярностью или ненадежностью), redis, как правило, устойчив в своей естественной среде, то есть работает на Linux и доступ из одной подсети. Еще одно решение, которое вы можете попробовать, - запустить сервер redis на виртуальной машине Linux в том же центре обработки данных, откуда он доступен, - это может обойти любые дросселирование или другие ограничения, которые может добавить управляемая служба Azure Redis.

+0

Не то, на что я надеялся, так как мы надеваем наручники на Azure - я увеличил тайм-аут Auto Retry до абсурдного значения (20 с) и надеюсь, что этого достаточно, чтобы временно смягчить влияние этих проблем. Если это действительно проблема на стороне сервера, мне показалось странным, что не сообщается об отчетности, чтобы предупредить нас о том, что есть проблема с дросселированием/ошибкой/загрузкой. Мы уже пытались увеличить возможности экземпляров Azure Redis далеко за пределами того, что нам было нужно - без везения. Благодарим вас за четкое объяснение. Мы рассмотрим вопрос о подаче билета с Azure .. – jglassco

+1

. Следуйте за этой проблемой: я подал заявку на поддержку Azure - они признали, что есть проблема с Azure Redis и клиентом ServiceStack. Команда поддержки кеша исправила наши экземпляры redis вручную, и проблема исчезла. Я бы предположил, что они будут включать этот патч автоматически в ближайшем будущем, но на данный момент мы должны его запросить (для стандартных экземпляров у Premium уже был патч, по-видимому). – jglassco

+0

@jglassco Отличный thx для последующей работы. Я предполагаю, что управляемая служба Redis работает под управлением своего порта Windows, а не идеальна, так как Redis работает лучше всего на Linux. – mythz