tcp - 如何确定我是否需要来自 Rust io::Error 的新 TCP 连接?

标签 tcp error-handling redis io rust

我正在使用 redis crate从 Rust 通过 TCP 与 Redis 服务器通信。如果 TCP 连接由于某种原因断开(例如服务器崩溃),我想通过创建一个新的 Connection 来尝试重新连接(有一些回退以免阻塞服务器) .

我的问题是如何确定何时重新连接? redis crate 抛出 RedisError的,其中一些包含 io::Error .如何确定哪些 io::Error 需要新连接,哪些不需要?我想我必须匹配 io::Error::kind()沿着这条线:

use std::io;

fn needs_new_connection(error: &io::Error) -> bool {
    match error.kind() {
        io::ErrorKind::ConnectionReset |
        io::ErrorKind::ConnectionAborted => true,
        _ => false,
    }
}

但是什么ErrorKind应该在里面吧?我应该添加 NotConnected 吗? 超时?其他的?或者我应该使用一些完全不同的方法?

虽然我正在使用Redis,但我认为将其视为纯粹关于TCP 的问题应该没问题。我不支持 Unix 套接字。

最佳答案

理想情况下,您应该处理 RedisError 本身,以确定发生了什么以及是否需要重新连接。在该类型上定义了一堆有用的方法来帮助您弄清楚您需要做什么:

  • is_io_error() 将返回 true 如果错误是由于 I/O 而 is_timeout() 将返回 true 如果原因是 I/O 超时
  • is_connection_dropped() 如果您的连接断开则返回 true
  • is_connection_refusal() 如果您的连接被主动拒绝(或者服务器完全不存在),则返回 true

这些方法可以让您查明是哪种类型的连接错误,而不必枚举所有可能的变体。特别是,为了涵盖大多数情况,您会对组合它们感兴趣。在这种情况下,我会老实说 (error.is_io_error() || error.is_connection_dropped()) && !error.is_connection_refusal()。这涵盖了所有意外 I/O 故障案例,同时确保避免诸如无效凭据之类的案例。

关于tcp - 如何确定我是否需要来自 Rust io::Error 的新 TCP 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758814/

相关文章:

c - 如果没有 "\n",服务器端 printf() 不会打印(使用套接字的 TCP 客户端-服务器)

c# - TCP 文件传输 - 几个字节错误

error-handling - 如何处理来自reqMktData调用的错误

html - Controller 重定向导致错误403 'Type=Forbidden'

redis - 在 Redis 中查询频率统计信息?

c - 在用 C 编写的 Linux TCP/IP 服务器中处理 Ctrl-C

c - 套接字编程: sending and receiving different data to different clients in C

php - 处理返回 200 的 JSON API 响应的最佳方法是什么?

c# - 在 Redis 中存储和使用配置文件的最佳方式?

redis - redis中如何保证master和slave之间的数据一致性