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