【发布时间】:2012-09-19 22:24:58
【问题描述】:
我有一个节点服务器,它执行以下操作:
我有一个外部服务器中的 URL 列表,称为 URLServer。当用户访问我的节点服务器时,我的节点服务器向 URLServer 发出请求并获得一个包含 20 个 URL 的列表。一旦我们得到这 20 个 URL,我希望我的节点服务器去获取每个 URL 的标题,这意味着我将获取 URL 并创建一个 DOM,然后提取标题,我还会得到其他数据,所以这就是它必须完成的方式。完成此操作后,我希望将 URL 的标题和 URL 保存在内部存储器和/或数据库中。所以我有一个 URL 缓存和一个标题缓存(我不想一直获取 URL)。
我有这样的事情: if(URL-cache is empty) 从 URLServer 获取 URL 并缓存这些 URL
然后我想检查每个 URL 以查看它们的标题是否在我的缓存中,所以我这样做了: 对于每个 URL 如果标题缓存 [URL],很好 else 获取站点,创建 DOM,提取标题 + 其他数据并缓存
这对一个用户来说非常有用,但是当我尝试在服务器中加载重负载时,服务器会挂起。我认为服务器挂起的原因如下:
用户 1 请求 - 空缓存 - 获取 URL 并在完成后获取 URL 的内容 用户 2 请求 - 该用户的缓存仍然是空的,因为对用户 1 的请求尚未完成!!!因此,用户 2 再次强制获取 URL 及其各自的内容。 用户 3 请求 - 用户 1 和用户 2 请求尚未完成,所以同样的问题...
所以,假设我需要获取 10 个 URL,而不是打开 10 个连接,每个 URL 一个然后缓存数据,如果我有 20 个用户同时访问服务器,我将打开 200 个连接(每个用户打开 10 个连接)。
如何阻止用户 X(其中 X>1)导致这些事件?我基本上希望服务器关闭一个门并要求每个用户等到它填充缓存,然后在填充后打开门,有什么办法吗?
【问题讨论】:
标签: node.js events asynchronous