是否可以检测到客户端断开连接?

Is it possible to detect that a client disconnected?

我正在使用redis实现一个RPC机制。

服务器连接到 Redis 并侦听请求 BLPOP job:queue 0,客户端连接并添加请求 RPUSH job:queue [$job_id, ...]。客户端然后等待结果 BLPOP job:done:$job_id 0,服务器将结果推送到该队列以供客户端使用。

如果在维修工作期间,例如一旦服务器调用 BLPOP 并获得作业详细信息,服务器就会死掉,客户端将永远等待响应,但它永远不会到达。

有什么方法可以在 Redis 中检测到这种情况,例如服务器接受作业后,崩溃,连接关闭(例如,OS 关闭了 tcp 套接字)。 Redis 能否发出客户端已断开连接的信号,我们能否使用它来检测作业已被接受但永远不会完成?或者也许除了队列之外,redis 中还有更好的 RPC 机制?

你通常做的实际上是让你的 popping 客户端从原始列表做一个 BRPOPLPUSH 到一个特殊的 "I'm handling this list"。您可以定期让另一个进程扫描特殊列表以检测 "lost" 作业并将它们 return 放入队列(或您希望实施的任何其他策略)。