API 的多次点击导致服务器瘫痪

问题描述 投票:0回答:2

我正在使用 API(让我们假设它是 facebook)来收集两个给定日期之间的数据。由于 API 限制(像大多数一样),我一次只能抓取这么多,因此必须对结果进行分页。

这是我的问题/问题..是否更好

  1. 返回更少的结果,并更多地调用 api
  2. 返回更多结果,并减少对 api 的调用

我正在运行一个 4GB 的云服务器实例..

我正在查看的数据是 XML 格式,包含大约 20k 条目。每个条目中可能还包含另外 20 个标签。一旦完全拉下来,数据最终约为 10MB。.我的问题是当我的服务器访问 api 时,收集此信息时 CPU 和内存峰值几乎达到 100%。我尝试过一次检索 500 个,一次检索 1000 个,一次检索 5000 个..这是我需要一次收集 20 个的东西吗..还是还有其他我应该看的东西?

我不知道还需要提供什么,如果有什么我可以提供的,请告诉我

根据答案进行更新

  • 我使用 Storm on Demand 进行托管,它对我们来说运行完美,而且似乎是很棒的硬件 - https://www.stormondemand.com/cloud-server/
  • 我使用 HPricot 来解析 XML(可能可以优化,我不是这方面的专家)
  • 我确实需要所有数据,该服务不提供导出,仅提供 API。

编辑[以帮助人们以后遇到这个问题] 我从 Hpricot 切换到 Nokogiri,速度快得多。 另外,我正在内存中构建一个 XML 文件,显然这是一项非常繁重且非常耗时的任务。通过修复这两件事,我将此操作从大约 10 分钟缩短到了 1 分钟多一点。

ruby-on-rails
2个回答
1
投票

这里列出了一些需要注意的事项:

  • 优化您的代码。尝试分析您的代码,看看是否可以改进它。很可能使用更好的解析器(DOM 与 SAX)。
  • 获得更好的硬件/托管。 4GB只是内存。您很可能使用的是共享主机/虚拟机并且 CPU 有限
  • 将一些 CPU/内存密集型操作卸载到更快的服务/应用程序,例如 XML 处理、数据分析、文件 io 可以在 C/C++ 中完成
  • 在适当的云环境中,您应该能够生成更多虚拟机并相应地调整您的作业/负载。这将花费更多的成本,并且需要某种工作经理。

1
投票

您需要问的问题是为什么您的 CPU+ 内存会出现峰值? 4GB 足以处理这些数据,那么您的代码是否针对处理此任务进行了优化?如果没有,你能做什么?

你的代码优化得足够多吗?很公平。您现在可以使用 C 扩展重写它们。

优化代码后,我建议“稍后”检查处理这些数据,就像延迟作业一样。这样您就不会阻塞整个数据集,这可能会给您的服务器带来压力。

您还提到您正在运行云服务器,我可以假设您可以访问更多虚拟机。您可以并行处理这些数据,以减少每台机器的压力。

© www.soinside.com 2019 - 2024. All rights reserved.