【问题标题】:Handling of transient network errors with StackExchange.Redis使用 StackExchange.Redis 处理瞬时网络错误
【发布时间】:2017-08-02 10:45:24
【问题描述】:

寻找有关在使用 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()?

感谢您的指导。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

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

    就实际重试而言,只要多路复用器的部分连接还活着,就可以退后重试。

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

    【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多