Ruby 如何在第一次收到请求后快速机械化?
How is Ruby Mechanize fast after first get request?
我最近第一次使用 Ruby 的 Mechanize gem 编写了一个抓取程序。它必须访问服务器(一些 'xyz.com/a/number'),脚本将在其中生成数字。喜欢 'xyz.com/a/2' 和 'xyz.com/a/3'。
事实证明,第一个请求花费了很多时间——在 512kbps 的连接上大约需要 1.5 秒。但是下一个请求是在0.3ms内完成的。
怎么可以这么快?它有一些缓存机制吗?
请求之间的速度变化有很多可能的来源。立即 spring 想到的几个:
在您的客户端缓存 DNS 查询。第一次调用必须将 "xyz.com" 转换为“123.45.67.89”,涉及 DNS 查找,这可能很慢。
HTTP 保活。客户端和服务器之间会进行初始对话以启动 HTTP 数据传输。在高延迟连接上,您会注意到这一点。如果服务端和客户端都遵守HTTP keep-alive,那么一次连接就可以覆盖多个请求。
服务器端缓存。您正在抓取的服务器使用缓存来加速多个类似的请求。例如,它可能正在缓存与当前会话有关的数据,或者甚至在您第一次请求之前还没有完全编译脚本。
服务器端虚拟机资源分配。如果服务器在虚拟化系统上共享 space,并且不提供高流量,那么在第一个请求确保所有内容都在 RAM 中并分配 CPU 后,它可能会变得更加响应。
这绝不是详尽无遗的。上面的例子只是为了说明这种行为 - 初始响应缓慢,随后响应更快 - 对于 Web 服务来说非常普遍,并且有多种原因。
我最近第一次使用 Ruby 的 Mechanize gem 编写了一个抓取程序。它必须访问服务器(一些 'xyz.com/a/number'),脚本将在其中生成数字。喜欢 'xyz.com/a/2' 和 'xyz.com/a/3'。 事实证明,第一个请求花费了很多时间——在 512kbps 的连接上大约需要 1.5 秒。但是下一个请求是在0.3ms内完成的。
怎么可以这么快?它有一些缓存机制吗?
请求之间的速度变化有很多可能的来源。立即 spring 想到的几个:
在您的客户端缓存 DNS 查询。第一次调用必须将 "xyz.com" 转换为“123.45.67.89”,涉及 DNS 查找,这可能很慢。
HTTP 保活。客户端和服务器之间会进行初始对话以启动 HTTP 数据传输。在高延迟连接上,您会注意到这一点。如果服务端和客户端都遵守HTTP keep-alive,那么一次连接就可以覆盖多个请求。
服务器端缓存。您正在抓取的服务器使用缓存来加速多个类似的请求。例如,它可能正在缓存与当前会话有关的数据,或者甚至在您第一次请求之前还没有完全编译脚本。
服务器端虚拟机资源分配。如果服务器在虚拟化系统上共享 space,并且不提供高流量,那么在第一个请求确保所有内容都在 RAM 中并分配 CPU 后,它可能会变得更加响应。
这绝不是详尽无遗的。上面的例子只是为了说明这种行为 - 初始响应缓慢,随后响应更快 - 对于 Web 服务来说非常普遍,并且有多种原因。