2015-05-27 40 views
0

我最近首次用Ruby的机械化宝石编程了一个刮刀。它必须打到服务器(一些'xyz.com/a/ number'),其中编号将由脚本生成。像'xyz.com/a/2'和'xyz.com/a/3'一样。 事实证明,第一个请求花了很多时间 - 在512kbps连接上大约1.5s。但下一个请求在0.3ms内完成。第一次获取请求后,Ruby如何快速机械化?

它怎么能这么快?它有一些缓存机制吗?

回答

2

请求之间的速度变化有很多可能的来源。一些立即想到:

  • DNS查找缓存在您的客户端。第一次调用必须将“xyz.com”转换为“123.45.67.89”,涉及DNS查询可能较慢。

  • HTTP保持活动状态。客户端和服务器之间有一个初始会话来启动HTTP数据传输。在高延迟连接上,您会注意到这一点。如果服务器和客户端都尊重HTTP保持活动状态,则可以建立一次连接以覆盖多个请求。

  • 服务器端缓存。您正在抓取的服务器使用缓存来加速多个类似的请求。例如,它可能会缓存与当前会话相关的数据,或者甚至直到第一次请求才完全编译脚本。

  • 服务器端VM资源分配。如果服务器在虚拟化系统上共享空间并且不提供高流量,那么在第一个请求确保所有内容都在RAM中并分配了CPU之后,它可能会变得更具响应性。

这绝不是详尽无遗的。上面的例子只是为了说明这种行为 - 最初的慢响应,其次是更快的响应 - 对于Web服务来说非常普遍,并且有多种原因。