Azure-C#并发-最佳实践
我们正在使用Microsoft Azure创建一个基于Web的API。问题是要检索的数据太多(涉及到组合/排列) 如果我们使用标准的Web作业方法,我们计算出处理我们想要获得的所有数据需要大约200年的时间——我们希望每周都能刷新数据 处理来自API的每个请求/响应大约需要0.5-1.0秒。请求大小平均为20000字节,响应平均为35000字节。我相信请求的总数是数百万 思考这个问题的另一种方式是:您将如何使用Azure进行Web刮取,并确保不会过载(在内存+网络方面)它所运行的VM?(我认为这种情况下不需要太多CPU处理)。 我们迄今为止所做的尝试:Azure-C#并发-最佳实践,c#,azure,concurrency,parallel-processing,C#,Azure,Concurrency,Parallel Processing,我们正在使用Microsoft Azure创建一个基于Web的API。问题是要检索的数据太多(涉及到组合/排列) 如果我们使用标准的Web作业方法,我们计算出处理我们想要获得的所有数据需要大约200年的时间——我们希望每周都能刷新数据 处理来自API的每个请求/响应大约需要0.5-1.0秒。请求大小平均为20000字节,响应平均为35000字节。我相信请求的总数是数百万 思考这个问题的另一种方式是:您将如何使用Azure进行Web刮取,并确保不会过载(在内存+网络方面)它所运行的VM?(我认为这
我有一些刮的经验,所以我会分享我的想法
另一方面,根据API的具体情况,当您开始对API端点施加太大压力时,您的主要问题可能会是API所有者简单地将您限制到爬行状态。实际上,web scraper是我在Azure中安装并运行了相当长一段时间的东西:-) 好吧,这里没有“魔弹”。在截止日期前收集大量信息来源是相当困难的 工作原理(最重要的事情):
- 我使用工作者角色和C代码作为代码本身
- 对于调度,我使用队列存储。我将爬网任务放在队列上,并有一个超时时间(例如“什么时候爬网”),然后让刮板将它们取下。您可以在队列大小上设置触发器,以确保在速度方面满足最后期限——就个人而言,我不需要它们
- SQLAzure很慢,所以我不使用它。相反,我只使用表存储来存储报废的项目。请注意,更新数据可能相当复杂
- 不要使用太多的线程;相反,对所有网络流量使用异步IO 也可能需要考虑额外的线程需要额外的内存(解析树可以变得相当大)-所以在那里有一个折衷方案…我确实记得使用过一些线程,但实际上只是一些