Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure-C#并发-最佳实践_C#_Azure_Concurrency_Parallel Processing - Fatal编程技术网

Azure-C#并发-最佳实践

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?(我认为这

我们正在使用Microsoft Azure创建一个基于Web的API。问题是要检索的数据太多(涉及到组合/排列)

如果我们使用标准的Web作业方法,我们计算出处理我们想要获得的所有数据需要大约200年的时间——我们希望每周都能刷新数据

处理来自API的每个请求/响应大约需要0.5-1.0秒。请求大小平均为20000字节,响应平均为35000字节。我相信请求的总数是数百万

思考这个问题的另一种方式是:您将如何使用Azure进行Web刮取,并确保不会过载(在内存+网络方面)它所运行的VM?(我认为这种情况下不需要太多CPU处理)。

我们迄今为止所做的尝试:

  • 使用了服务总线队列/工作人员角色扩展到8个小型虚拟机-但这导致了大量网络错误的发生(每个工作人员角色虚拟机可以处理多少网络限制)
  • 使用了服务总线队列/连续Web作业扩展到8个小型虚拟机-但这似乎工作较慢-即使扩展,也不能让我们对幕后发生的事情有太多的控制。(我们真的不知道有多少虚拟机在运行)
  • 这些东西似乎是为CPU计算而构建的,而不是为Web/API抓取而构建的。

    我只是想澄清一下:我把我的请求放入一个队列中,然后由我的多个虚拟机接收并进行处理以获得响应。这就是我使用队列的方式。每个虚拟机都使用微软规定的ServiceBusTrigger类

  • 有很多小的虚拟机还是只有几个大的虚拟机更好
  • 我们应该关注哪些C#类
  • 在Azure上尝试这样做时,技术上的最佳实践是什么

  • 我有一些刮的经验,所以我会分享我的想法

  • 这些东西似乎是为CPU计算而构建的,而不是为Web/API抓取而构建的。
  • 它们是为动态扩展而构建的,因为您的任务并不是您真正需要的

  • 如何确保不会使VM过载?
  • 测量响应时间和错误率,并调整代码以降低它们

  • 我认为在这种情况下,您不需要太多的CPU处理。
  • 这取决于每秒有多少数据进入,以及你在用它做什么。对快速传入的数据进行更复杂的解析(如果您决定在同一台机器上进行解析)将很快占用CPU

  • 8个小型虚拟机导致大量网络错误发生(必须有一定的网络限制)
  • 虚拟机越小,共享的资源就越少。存在吞吐量限制,并且您的邻居与您共享实际硬件时存在问题。通常,实例大小越小,遇到的麻烦就越多

  • 拥有大量小型虚拟机还是只有少量大型虚拟机更好?
  • 根据我的经验,较小的虚拟机太残废了。但是,您的里程可能会有所不同,这完全取决于特定任务及其解决方案的实施。真的,你必须在你的环境中测量自己

  • 我们应该关注哪些C#类?
  • 在Azure上尝试这样做时,技术上的最佳实践是什么?
  • 对于高通量刮片,您应该关注基础架构。在不同的Azure数据中心中,您将有不同的延迟,在不同VM大小下,您将有不同的网络延迟/持续吞吐量体验,具体取决于与您共享硬件的用户。最佳实践是尝试并找到最适合您的方法—更改数据中心、虚拟机大小或其他

    Azure可能不是这个问题的最佳解决方案(除非你正在疯狂消费)。8台小型虚拟机每月450美元。这足以支付一台非托管专用服务器的费用,该服务器具有256Gb的RAM、40个硬件线程和500Mbps-1Gbps(甚至高达几Gbps突发)的高质量网络带宽,而不会出现延迟问题

    对于您的预算,您将有一个专用服务器,您不能超载。您将拥有足够的RAM来处理异步固定(如果您决定使用异步),或者有足够的硬件线程用于多线程同步IO,从而提供最佳吞吐量(如果您选择使用固定大小的线程池进行同步)


    另一方面,根据API的具体情况,当您开始对API端点施加太大压力时,您的主要问题可能会是API所有者简单地将您限制到爬行状态。

    实际上,web scraper是我在Azure中安装并运行了相当长一段时间的东西:-)

    好吧,这里没有“魔弹”。在截止日期前收集大量信息来源是相当困难的

    工作原理(最重要的事情):

    • 我使用工作者角色和C代码作为代码本身
    • 对于调度,我使用队列存储。我将爬网任务放在队列上,并有一个超时时间(例如“什么时候爬网”),然后让刮板将它们取下。您可以在队列大小上设置触发器,以确保在速度方面满足最后期限——就个人而言,我不需要它们
    • SQLAzure很慢,所以我不使用它。相反,我只使用表存储来存储报废的项目。请注意,更新数据可能相当复杂
    • 不要使用太多的线程;相反,对所有网络流量使用异步IO
    • 也可能需要考虑额外的线程需要额外的内存(解析树可以变得相当大)-所以在那里有一个折衷方案…我确实记得使用过一些线程,但实际上只是一些
    请注意,如果您现在需要,这可能需要重新设计和实现完整的web刮板