Mat*_*zer 10 .net c# exception redis stackexchange.redis
我正在经历所谓的Timeout执行HGET公司:产品:设置,inst:1,队列:8,qu = 0,qs = 8,qc = 0,wr = 0/0,in = 79/1超时异常.
这很奇怪,因为相同的Redis实例和同一台机器存储数据,但它是一个抛出此异常的特定应用程序.更新:实际上,同一个应用程序,上面一行从Redis接收数据.问题在于HGET.
此外,我已经将多路复用器配置的超时时间增加到6秒而没有运气.
另外,我检查了IDatabase实例具有IsConnected与true价值.
如何解释这些错误消息以及整个超时背后的问题是什么?
当一些代码部分获取数据库(即multiplexer.GetDatabase())时,我已成功修复了问题.
虽然多路复用器具有AppDomainStackExchange.Redis文档中描述的实例,但许多控制组件的反转都IDatabase在他们自己的代码中创建了许多实例.也就是说,IDatabase实例不是共享的.
实际代码正在执行a ListRightPopLeftPush,之后,它实例化控件组件的反转,该组件在组件实例化期间读取散列键.如果在执行所谓的之前实例化整个组件ListRightPopLeftPush,则整个HashGet不会抛出超时异常.
看起来即使ListRightPopLeftPush从其他IDatabase实例执行,在IDatabase执行读取操作时,它会在下一个实例中产生某种问题.
无论如何,我的修复不回答这个问题.我刚刚添加了更详细的信息,让我们找到问题所在和自己的解决方案.
无论如何,上面的"修复"不会修复对Redis的进一步读取访问.我在进一步的调用中得到了相同的超时异常.现在,in在异常的消息中发现了参数60/1.
基于聊天中的长时间讨论以及大量的挖掘,看起来在一些模糊的场景中,当我们处理.TrySetResult(我们经常这样做)时,TPL正在劫持专用的读者线程.如果您进行同步调用,这会导致即时死锁,因为如果忙于等待任务完成(它本身只能完成),它就不可能处理任何套接字数据.我们确实有专门的代码来防止这种情况,但看起来变通方法实际上迫使它在其他一些场景中发生.哪个......太可怕了.我会看到我能找到的东西.但基本上,问题是目前在某些有限的情况下,TaskCompletionSource.TrySetResult正在为TPL提供动力以运行同步延续.这包括Task.WhenAny.