如果客户端是多线程的,客户端对HTTP 429的正确反应是什么?

时间:2018-11-24 10:59:45

标签: multithreading http rate-limiting http-status-code-429

HTTP状态代码429告诉发出请求的客户端回退,并在响应的Retry-After标头中指定的时间段后重试该请求。

在单线程客户端中,很明显,获取429的线程应按指示等待,然后重试。但是RFC明确指出

  

此规范未定义原始服务器如何识别   用户,以及如何计算请求。

因此,在多线程客户端中,保守的方法将阻止所有线程发送请求,直到Retry-After时间点为止。但是:

  • 许多线程可能已经超出了可以记录来自一个被拒绝线程的信息并会再发送至少一个请求的地步。
  • 线程之间的全局同步可能很难实现并获得成功
  • 如果安装程序不仅运行多个线程,还运行多个客户端(可能在不同的计算机上运行),那么在一个429上备份所有线程将变得很简单。

是否有人从现场获得云提供商的服务器如何实际处理的特定数据?如果我不全局限制所有线程,它们是否会立即恶化? Microsoft's advice

  
      
  1. 等待“重试后”字段中指定的秒数。
  2.   
  3. 重试请求。
  4.   
  5. 如果请求再次失败并显示429错误代码,则说明您仍然处于受限制状态。继续使用建议的Retry-After延迟,然后重试请求,直到成功为止。
  6.   

它两次说“请求”而不是“任何请求”或“所有请求”,但这是我不敢相信的法律类型的解释。

为确保这不是一个意见问题,请允许我尽可能以事实为依据:

是否有关于云API的更详细的规范(Microsoft,Google,Facebook,Twitter),然后是上面的示例,它使我能够做出明智的决定,即是否有必要进行全局补偿,或者是否足以满足特定的要求。请求得到429?

1 个答案:

答案 0 :(得分:0)

服务器知道其同步或希望程序员这样做。因此怀疑是否有处罚,除非他们收到大量请求,这些请求在429年后根本不撤消。

每个线程都应该等待,但是每个线程都需要等待,直到分别被告知。

一个好的系统会知道它的速率是多少,并且在其中。一种实现方法是在请求之间使用sleepFor变量。可以通过反复试验得出确切的prod值,它是睡眠时间减去先前的请求时间。

因此,如果一个请求结束,并说花费了x毫秒。现在,如果睡眠时间是 0以下,立即移至下一个请求 如果大于等于1,则发现sleepTime-x,如果小于1,则立即转到下一个,否则睡眠那么多毫秒,然后移至下一个请求。

另一种方法是每5分钟左右进行一次计数,然后,如果线程的实际请求数量超过该数量,则它将休眠直到5分钟为止,然后再移至下一个。这里可以将5设置为timePeriod。

我们要做的是将这些值保存在数据库中,但在运行时将其缓存。还有一个页面使缓存无效,因此,如果我们愿意,我们可以从管理页面更新数据库,然后使缓存无效,因此客户端将在运行时获取新信息。这有助于配置正确的值,使其不超出API限制并完成足够的工作。