【问题标题】:Timeout exception after async commands and Task.WhenAny awaits in StackExchange.Redis在 StackExchange.Redis 中等待异步命令和 Task.WhenAny 后的超时异常
【发布时间】:2014-10-23 10:09:54
【问题描述】:

我正在经历所谓的超时执行 HGET company:product:settings, inst: 1, queue: 8, qu=0, qs=8, qc=0, wr=0/0, in =79/1 超时异常。

这很奇怪,因为同一台机器上的同一个 Redis 实例正在存储数据,但它是一个特定的应用程序引发了这个异常。 更新:其实同一个应用,上面一行从Redis接收数据。问题在于HGET

另外,我将多路复用器配置的超时时间增加到 6 秒,但没有运气。

此外,我检查了IDatabase 实例具有IsConnectedtrue 值。

如何解释这些错误消息以及整个超时背后的问题是什么?

一些背景...

我已成功解决了更改某些代码部分获得数据库(即multiplexer.GetDatabase())的问题。

虽然 multiplexer 如 StackExchange.Redis 文档中所述,每个 AppDomain 都有一个实例,但许多控制反转组件正在自己的代码中创建许多 IDatabase 实例。也就是说,IDatabase 实例未共享。

实际代码执行ListRightPopLeftPush,然后实例化控制组件的反转,该组件在组件实例化期间读取哈希键。如果在做所谓的ListRightPopLeftPush之前实例化整个组件,那么整个HashGet就不会抛出超时异常。

似乎即使从其他IDatabase 实例执行ListRightPopLeftPush,在执行读取操作时也会在下一个IDatabase 实例中产生某种问题。

无论如何,我的 fix 没有回答这个问题。我刚刚添加了更详细的信息,以便我们找到问题所在和自己的解决方案。

更新

无论如何,上述“修复”不会修复对 Redis 的进一步读取访问。我在进一步的调用中遇到了相同的超时异常。现在in 异常消息中的参数显示60/1

【问题讨论】:

  • in=79/1 告诉我有可用数据并且读者正在处理它;我需要检查一下是否有任何方法可以让读者在这里停滞不前。
  • @MarcGravell 嘿,你想怎么检查?无论如何,这是工作中的代码,我们应该在下周一检查...
  • @MarcGravell 没关系,我知道你要检查一些测试;)
  • @MarcGravell 您是否对问题背后的原因有任何线索?如果您需要更多详细信息,您可以询问他们,我会将它们添加到问题中
  • @MarcGravell 我添加了新的详细信息,因为我可以“修复”更改代码中某些执行顺序的问题。也许这会给你更多的信息.​​.....

标签: c# .net exception redis stackexchange.redis


【解决方案1】:

基于long discussion in chat 和大量挖掘,看起来在一些模糊的场景中,当我们执行.TrySetResult 之类的事情时,TPL 正在劫持专用的阅读器线程(我们经常这样做)。如果您进行同步调用,这会导致即时死锁,因为如果它正忙于等待任务完成(这只会自行完成),它就不可能处理任何套接字数据。我们确实有code in place specifically to prevent this,但看起来解决方法实际上强制它在某些其他情况下发生。这……太可怕了。我会看看我能找到什么。但基本上,问题在于当前,在一些有限的场景中,TaskCompletionSource.TrySetResult 正在为 TPL 提供运行同步延续的权力。这包括Task.WhenAny

【讨论】:

  • 我不知道是否应该将此标记为已解决,或者我们可以将其保持打开状态,直到您发布解决该问题的新版本 StackExchange.Redis 库。你有什么看法?
  • 如果您愿意,您的回答将解释从 X 版本开始问题得到解决,这将很有用!
  • 我在 Nancy 应用程序中发生了类似的事情,我不确定这是否应该归咎于此。关于什么受限场景可能导致这种情况发生的任何更新?
  • 如果在1.0.371 framework 4.5 版本中这对我来说很重要,我无法在单元测试中重现它,只能在 Nancy 应用程序中重现。
  • 这是否意味着我们应该或不应该使用异步方法?
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2017-08-14
  • 2020-07-08
  • 1970-01-01
相关资源
最近更新 更多