2017-08-01 89 views
2

寻找使用StackExchange.Redis客户端时处理临时网络问题的指导。使用StackExchange处理瞬时网络错误.Redis

为了说明起见,我并不是说最初使用ConnectionMultiplexer.Connect()连接到Redis服务器。我指的是如何处理在操作中出于任何原因而中断的连接。 (我们可以假设命令是幂等的,StringSet,StringGet)

我问,因为我们正在从ServiceStack迁移到StackExchange客户端。在我们正在替换的代码中,它使用ServiceStack,捕获异常并在短的thread.sleep()之后再次尝试操作。这种情况在我们的生产环境中相当频繁地发生,并且在大多数情况下重试都可以工作。

通常它与“一个已建立的连接是通过软件在主机中止”的消息一System.Net.SocketException或

如果一个系统“的现有连接被强行关闭远程主机”。 Net.SocketException被抛出,StackExchange.Redis会自动重试,直到syncTimeout时间已过?

如果SE.Redis不会自动重试,那么在初始操作失败和我们的代码中重试之间是否存在应该发生的建议步骤?如:

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

感谢您的任何指导。

回答

1

它不会自动重试。如果发生错误,您需要抓住并重试自己。

就实际重试而言,只要某些多路复用器的连接仍然存在,您可以退后一步并重试。

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

+0

谢谢你的建议。你是否意识到有一个线索提供了关于你提到的长期错误的更多信息? – eoldre

+0

在github上打开了大约一打的副本 https://github.com/StackExchange/StackExchange.Redis/issues/269 –