我正在使用 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/