我们正在使用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);
主要是将数据返回给客户端。
现在我正在考虑在这种情况下捕捉它是一个可能的想法特定的例外,然后再试一次。但我不确定这可能会导致客户端出现重复结果吗?
关于错误本身或重试想法的任何建议?
答案 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版本