11

我了解这CommandFlags.FireAndForget适用于您不关心响应的情况。

即使响应对正在运行的应用程序并不重要,它是否也能保证交付?

4

1 回答 1

14

实际上,Redis 协议并不真正支持“一劳永逸”的操作。除了 pub/sub 流量,所有 Redis 命令都匹配一个回复,没有办法告诉 Redis 服务器省略回复。

现在一些客户端(如 StackExchange.Redis)通过协议的异步实现来模拟“即发即弃”模式。实际上,StackExchange.Redis 中的“即发即弃”模式与“异步”模式非常相似,只是在收到回复时将其简单地丢弃。

它可靠吗?好吧,它保证了交付,因为 TCP/IP 保证了交付。网络会努力传输数据包(如果丢失了一些数据包,最终会重新传输数据包),但这一切都由 TCP 处理。

现在,如果服务器关闭,或者决定关闭连接,客户端只有在尝试从套接字读取时才会知道。StackExchange.Redis 可能会愉快地继续在死连接上发送命令一段时间。如果您有中间层(例如 Twemproxy),情况可能会更糟。

换句话说,“一劳永逸”的流量一般会被发送到服务器,并且不会在网络上丢失任何消息,但是如果您有服务器或连接问题,则可能会在客户端有机会注意到之前丢失一些流量它。我将其称为尽力而为的行为。

于 2014-09-07T10:58:19.143 回答