服务器程序中如何设计backup task功能
Retry
集群中有client、server1, server2三台机器,client需要向server请求数据,如果server1响应超时,则请求server2。server1、server2互为备份,包含同样的数据。
client:
for (id = 0; id < 2; id++) { if (TIMEOUT == do_request(server[id], timeout * get_timeout_percent(), req) ) { continue; // retry next server } }
Jeff Dean的一篇论文中介绍了Google利用backup request来大幅度降低响应延迟的问题,在论文中他将这种请求成为Tied Request。他在Achieving Rapid Response Times in Large Online Services这篇ppt中对此进行了专门的论述。
其原理很简单,还是用上一篇博客一个例子来简单阐述:
集群中有client、server1, server2三台机器,client需要向server请求数据,如果server1响应超时,则请求server2。server1、server2互为备份,包含同样的数据。client收到任意响应数据后立即通知其他请求过的server取消操作。
有两种设计方案:
方案一:1. client向server1发出req请求,req在server1任务队列中排队2. server1开始执行req,在执行前给client发一个quick response3. client如果在超时时间内收到quick response则不发起backup task,否则client一旦超时,就立即发起backup task3. client收到任意server的结果时,立即给其它所有发给过请求的server发cancel request4. client先行退出5. 对于执行任务的server,它如果及时收到了cancel request,则直接取消任务,如果收到不及时,任务已经开始,则还是老老实实做任务。任务做完后丢弃结果。6. client收到过期的结果直接丢弃方案二:1. client向server1发出req请求2. client等待超时,则立即向server2发req请求3. 任意server返回了req结果,则发cancel request给其它相关server4. client收到过期的结果直接丢弃