2009-06-10 42 views
1

我有一个系统需要向外部系统发送请求,只要用户在我的系统上进行搜索。客户端服务器系统中退避机制的模式

如果外部系统关闭或需要非常长的时间来回答,我希望我的系统“退后”一段时间。与其试图向外部系统发出更多请求,我只想让我的系统用户立即知道我们目前不会处理他们的请求。

这会为用户带来更好的体验(不必等待超时),我的系统中的资源占用更少(线程不会忙于等待外部系统没有响应或超时)以及它会省掉外部系统。 (在可能已经处于负载状态的情况下)

经过一段时间,或者当我的系统发现外部系统再次响应时,我想再次恢复正常行为。

是否有任何模式或标准的方式来做这种事情?具体来说就是跟踪超时/超时请求的机制,以及什么时候我们应该再次尝试的控制机制。

回答

2

我不记得在文献中看到过这种情况,但我注意到这种任务的模式是以“调度队列”为中心 - 一种使各种事情发生的方式(==获取调用的函数或方法返回),除非先前取消(例如Python的sched标准库模块)。当您向后端发送一个(异步)请求时,您也会从现在开始计划X秒的超时事件;请求对象知道计划的超时的ID(如果在此之前满足请求,则取消它),或者还保留一组未处理的请求(所以超时知道何时不需要它) - 哪一个是好的无论如何,因为它使处理“真正意义上的超时”更容易,请参阅下文。

当发生超时时,它会在将来为Y秒计划一次重试,并将来自该容器的所有挂起的请求移动到将来要重试的请求的容器中(并取消所有其他超时(如果这就是系统被设置),并且还向所有等待的客户端发送“后端很慢,我们将在Y秒内重试”通知。

发生重试事件等等等等。如果在系统暂停时新请求到达,它们会直接进入“待重试”bin。

虽然我找不到描述的这种模式,但如果有的话,它可能在Schmidt's excellent book ...强烈推荐阅读! - )

相关问题