【问题标题】:Pattern for a back off mechanism in a client server system客户端服务器系统中的退避机制模式
【发布时间】:2009-06-10 05:39:29
【问题描述】:

每当用户在我的系统上进行搜索时,我的系统需要向外部系统发送请求。

如果外部系统出现故障或需要很长时间才能响应,我希望我的系统“退出”一段时间。我不想尝试向外部系统发出更多请求,我只想让我的系统用户立即知道我们目前不会处理他们的请求。

这将为用户带来更好的体验(不必等待超时),减少我系统中的资源使用(线程不会忙于等待来自外部系统的无响应或超时)并且它将节省外部系统。 (在它可能已经在努力应对负载的情况下)

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

有没有做这种事情的模式或标准方法?特别是跟踪超时/长请求的机制,以及我们应该何时开始重试的某种控制机制。

【问题讨论】:

    标签: algorithm design-patterns timeout client-server


    【解决方案1】:

    我不记得在文献中看到过这种情况,但我注意到此类任务的模式集中在“调度队列”——一种使各种事情发生的方法(==获取回调的函数或方法) 在某些时候,除非之前取消(例如 Python 的 sched 标准库模块)。当您向后端发送(异步)请求时,您还会在 X 秒后安排超时事件;请求对象知道预定超时的 ID(如果在此之前满足请求,则取消它),或者还维护一组待处理的请求(因此超时知道何时不需要它)——这很好无论如何,它使处理“真正意味着它的超时”变得更容易,见下文。

    当确实发生超时时,它会安排未来 Y 秒的重试,并将所有挂起的请求从该容器移到一个请求容器中,以便在未来重试(如果系统是这样,则取消所有其他超时已设置),并且还会向所有等待的客户端发送“后端速度慢,我们将在 Y 秒后重试”的通知。

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多