一尘不染

使用StackExchange.Redis处理瞬时网络错误

redis

在使用StackExchange.Redis客户端时,寻求有关处理临时网络问题的指导。

为了澄清起见,我并不是要首先使用ConnectionMultiplexer.Connect()连接到Redis服务器。我指的是在操作中间如何处理由于任何原因而中断的连接。(我们可以假设该命令是幂等的,StringSet,StringGet)

我问是因为我们正在从ServiceStack迁移到StackExchange客户端。在我们要替换的使用ServiceStack的代码中,捕获了异常,在短暂的thread.sleep()之后将再次尝试该操作。这在我们的生产环境中经常发生,并且在大多数情况下重试是可行的。

通常是System.Net.SocketException,消息为“主机中的软件中止了已建立的连接”或“远程主机强行关闭了现有连接”

如果抛出System.Net.SocketException,StackExchange.Redis是否会自动重试直到syncTimeout时间过去?

如果SE.Redis没有自动重试,那么在我们的代码中,在初始操作失败和重试之间应该采取任何建议的步骤吗?如:

  • 等待一小段时间?
  • 重新创建多路复用器?(我猜不是)
  • 调用Close()和Configure()吗?

感谢您的指导。


阅读 219

收藏
2020-06-20

共1个答案

一尘不染

它不会自动重试。如果发生错误,则需要捕获并重试。

就实际重试而言,只要某些多路复用器的连接仍然有效,您就可以退后再试。

如果连接失败,它将 尝试
恢复,但是存在一个长期存在的错误,在该错误中,它可能会间歇性地进入某些不可恢复的状态并保持断开连接。如果有IsConnected返回,我们将通过重新创建多路复用器来解决此问题false

2020-06-20