CURLOPT_CONNECTTIMEOUT 和 CURLOPT_TIMEOUT 对同一服务器的良好生产价值

Good production values for CURLOPT_CONNECTTIMEOUT and CURLOPT_TIMEOUT towards same server

我希望我的问题不是太武断:在我的生产服务器上,我有一个页面使用 cURL 向同一服务器上的另一个应用程序发送 API 调用。

我想在 CURLOPT_CONNECTTIMEOUT 上设置适当的值然后 CURLOPT_TIMEOUT 留出足够的时间来确保请求完成,以防有很多请求,但同时我不想不希望页面在 API 关闭或响应时间过长的情况下挂起,这将导致所有用户出现严重滞后,因为会生成大量队列。

API 进行了一个非常快速的数据库查询,returns 一个小的 json 结构,没有什么复杂的东西需要很多时间。

鉴于这些规范,有人可以对此发表评论吗?我目前有:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);

更新:

定义这些值时需要考虑许多因素。但是,2 秒对于 HTTP 请求(第一个字节)来说是可以接受的。如果您管理发起 HTTP 请求的服务器,那么您还应该考虑服务器资源,例如内存、CPU、IO、Web 服务器配置。但一般来说,您应该考虑 运行 traceroute 到您的端点以更好地理解延迟——这将帮助您为 CURL 定义更准确的超时值。当然,最后,如果您从那里发起许多请求,您应该为客户端考虑前面提到的服务器的相同资源限制。

希望对您有所帮助!请参阅博客:https://www.inmotionhosting.com/support/website/how-to/read-traceroute

您需要了解有关 API 行为的信息才能做出明智的决定。它还取决于 API 在您的代码中的使用方式以及在失败时您希望的行为。

考虑:

  • 如果您将值设置得太低,如果 API 出于某种原因需要更长的响应时间,您的代码将失败。
  • 如果 API 响应时间超过 ~4 秒,这意味着什么?
    • API 是否完全关闭?那么确实不需要再等了。
    • 是否超载?那它会在5秒内响应吗? 6? 10?这种超负荷状态会持续多久?通过更多地重载它来复合它是不好的,还是尽早中止代码并让 API 恢复更好?
    • 是否存在临时网络故障?如果你让超时 5 秒,那会解决吗? 10? 20?网络通常有多可靠?
  • 如果 API 由于上述任何原因响应缓慢,您希望您的应用 还是 死机
  • 你能保证 API 的特定响应时间吗?如果它不保持这个保证就意味着它挂了?
  • 您面向用户的网站的目标响应时间是多少?

    网络超时通常在 30 到 120 秒之间,这可以弥补暂时的网络问题,但也在人类的范围内。用户的注意力通常会在几百毫秒后转移,因此您需要将响应时间控制在一秒以内。但是,必须等待网站加载几秒钟的情况并不少见。

如果您需要调整这样一个关键参数以找到最佳设置,实用的方法是将其设置为某个初始值,使用一些测量工具来监控吞吐量和响应率,然后启动模拟预期生产水平负载的压力测试。然后您会看到错误率和响应率上升或下降,并且可以调整设置,直到找到满足所需约束的值。