我正在使用Redis实现RPC机制。

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

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

是否有某种方法可以在Redis中检测到这种情况,例如服务器接受作业后,崩溃,连接将关闭(例如,操作系统关闭了tcp套接字)。 Redis可以发出客户断开连接的信号吗,我们可以使用它来检测该作业已被接受但将永远无法完成吗?也许除了队列以外,redis中还有一种更好的RPC机制?

最佳答案

通常,您通常要做的是让弹出的客户端将 BRPOPLPUSH 从原始列表执行为特殊的“我正在处理此列表”。定期地,您可以让另一个进程扫描特殊列表以检测“丢失的”作业,并将其返回到队列(或您希望实现的任何其他策略)。

关于redis - 是否可以检测到客户端已断开连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49997082/

10-16 07:39