Redis和Siglnar偶尔在EVAL上挂起SocketFailure

时间:2016-03-04 14:02:56

标签: c# asp.net redis signalr

我们正在使用Redis:2.8.2400和SignalR 2.2.0

我们可以在日志中看到我们偶尔会挂起。

StackExchange.Redis.RedisConnectionException: SocketFailure on EVAL
 at Microsoft.AspNet.SignalR.Messaging.ScaleoutStream.Send(Func`2 send, Object state)
 at Microsoft.AspNet.SignalR.Infrastructure.Connection.Send(ConnectionMessage message)
 at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Outgoing(IHubOutgoingInvokerContext context)
 at Microsoft.AspNet.SignalR.Hubs.HubPipelineModule.<>c__DisplayClass1b.<BuildOutgoing>b__19(IHubOutgoingInvokerContext context)
 at Microsoft.AspNet.SignalR.Hubs.SignalProxy.TryInvokeMember(InvokeMemberBinder binder, Object[] args, Object& result)
 at CallSite.Target(Closure , CallSite , Object , List`1 )
 at SR.BusPortal.WebApi.Hubs.SearchHub.<>c__DisplayClass8_0.<SearchInternal>b__0(List`1 x) in D:\Continua\Agent\Ws\37347\Source\WEB\src\SR.BusPortal.WebApi\SR.BusPortal.WebApi\Hubs\SearchHub.cs:line 141
 at SR.BusPortal.Providers.Faciliators.SearchExecutioner.PrepareResultsAsync(IEnumerable`1 connections, Boolean deliverVerifications, Func`2 callback) in D:\Continua\Agent\Ws\37347\Source\WEB\src\SR.BusPortal.WebApi\SR.BusPortal.Providers\Faciliators\SearchExecutioner.cs:line 120
 at SR.BusPortal.Providers.Faciliators.SearchExecutioner.<>c__DisplayClass32_0.<SearchAsync>b__0(List`1 x) in D:\Continua\Agent\Ws\37347\Source\WEB\src\SR.BusPortal.WebApi\SR.BusPortal.Providers\Faciliators\SearchExecutioner.cs:line 216

 StackExchange.Redis.RedisConnectionException: SocketFailure on EVAL
  at Microsoft.AspNet.SignalR.Messaging.ScaleoutStream.Send(Func`2 send, Object state)
  at Microsoft.AspNet.SignalR.Infrastructure.Connection.Send(ConnectionMessage message)

我可以将其减少到主要在这段特定代码上失败:

 Clients.Caller.SearchResults(connectionModels);

主要是将数据返回给客户端。

现在我正在考虑在这种情况下捕捉它是一个可能的想法特定的例外,然后再试一次。但我不确定这可能会导致客户端出现重复结果吗?

关于错误本身或重试想法的任何建议?

2 个答案:

答案 0 :(得分:2)

我遇到了与Redis 2.8.2400相同的问题,您可以尝试将服务器更新到3.0.501

答案 1 :(得分:2)

原因不是redis服务器。我们使用Microsoft.AspNet.SignalR.Redis 使用内部1.0.316 StackExchange.Redis,但当前版本是1.0.488。

问题只发生在这个StackExchange.Redis版本上,而且Redis For Windows的支持告诉我他们过去经历过类似的问题,因为客户端连接并不总是被释放。

对于我们的缓存,我们使用ServiceSTack.Redis,即使signalR创建错误,他们也能够读取和写入redis。

在我们的例子中,我们只是使用粘性会话,以便我们可以删除signalR的背板。

另一种方法是使用另一个背板或等待信号R更新StackExchange.Redis版本