我有一个系统需要在用户搜索我的系统时向外部系统发送请求。
如果外部系统停机或需要花费非常长的时间来回答,我希望我的系统能够“退回”一段时间。我想让我的系统用户立即知道我们现在不会处理他们的请求,而不是尝试向外部系统发出更多请求。
这将为用户带来更好的体验(不必等待超时),减少系统中的资源使用(线程不会忙于等待没有响应或外部系统超时)和它会省去外部系统。 (在可能已经在加载的情况下)
一段时间后,或当我的系统发现外部系统再次响应时,我想再次恢复正常行为。
有没有任何模式或标准方法来做这种事情?特别是跟踪超时/长时间请求的机制,以及我们何时应该再次开始尝试的某种控制机制。
答案 0 :(得分:2)
我不记得在文献中看到过这种情况,但我注意到这些任务的模式集中在“调度队列” - 一种使各种事情发生的方式(==获取函数或方法回调)在某些时候,除非先前取消(例如Python的sched
标准库模块)。当您向后端发送(异步)请求时,您还要计划从现在起X秒的超时事件;请求对象是否知道调度超时的ID(如果在此之前满足请求则取消它),或者还保持一组待处理请求(因此超时知道何时不需要它) - 这是一个好的无论如何,因为它使处理“真正意味着它的超时”更容易,见下文。
当发生超时时,它会在将来安排重试Y秒,并将来自该容器的所有待处理请求移动到将来要重试的请求容器(并取消所有其他超时,如果系统是这样的话设置),并发送通知“后端很慢,我们将在Y秒内重试”给所有等待的客户。
当重试事件发生时等等。如果在系统暂停时新请求到达,它们将直接进入“待重试”仓。
虽然我找不到这种描述的模式,但如果在任何地方,它可能在Schmidt's excellent book ...强烈推荐阅读! - )