我正在使用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有更好的机制吗?
答案 0 :(得分:1)
你通常做的是让你的弹出客户端从原始列表中执行BRPOPLPUSH
到特殊的“我正在处理此列表”。您可以定期让另一个进程扫描特殊列表以检测“丢失”作业并将其返回到队列(或您希望实施的任何其他策略)。