【发布时间】:2015-09-02 13:54:46
【问题描述】:
我们正在使用 Microsoft Azure 抓取基于 Web 的 API。问题是要检索的数据太多(涉及组合/排列)。
如果我们使用标准的 Web Job 方法,我们计算出大约需要 200 年的时间来处理我们想要获取的所有数据 - 我们希望我们的数据每周刷新一次。
来自 API 的每个请求/响应大约需要 0.5-1.0 秒来处理。请求大小平均为 20000 字节,平均响应为 35000 字节。我相信请求的总数是数百万。
另一种思考这个问题的方法是:如何使用 Azure 到 Web 抓取 - 并确保不会使运行它的 VM 过载(就内存 + 网络而言)? (我认为在这种情况下你不需要太多的 CPU 处理)。
到目前为止我们所做的尝试:
- 使用的 Service Bus Queues/Worker Roles 扩展到 8 个小型 VM - 但这会导致发生大量网络错误(每个工作角色 VM 可以处理的数量必须有一定的网络限制) .
- 使用的 Service Bus Queues/Continuous Web Job 扩展到 8 个小型 VM - 但这似乎工作得更慢 - 甚至扩展,并没有让我们对幕后发生的事情有太多控制。 (我们真的不知道有多少虚拟机启动了)。
这些东西似乎是为 CPU 计算而构建的,而不是为 Web/API 抓取而构建的。
澄清一下:我将我的请求放入一个队列中,然后我的多个 VM 会拾取该队列以进行处理以获取响应。这就是我使用队列的方式。每个 VM 都使用 Microsoft 规定的 ServiceBusTrigger 类。
- 小型 VM 多还是大型 VM 少?
- 我们应该查看哪些 C# 类?
- 尝试在 Azure 上执行此类操作时,有哪些技术最佳实践?
【问题讨论】:
-
您将可扩展性与并行处理混淆了。队列和服务总线提高了可扩展性。并行处理由任务并行库、PLINQ 等处理。单个进程可以处理 很多 个并发 HTTP 请求,因为大多数时候它只是在等待响应。
-
也许我没有正确解释 - 我将我的 requests 放入队列中 - 然后我的多个 VM 将其拾取以进行处理以获取响应。这就是我使用队列的方式。每个 VM 都按照 MS 的规定使用 TPL 来使用
ServiceBusTrigger类
标签: c# azure concurrency parallel-processing