Architecture 同步队列工作者的访问

Architecture 同步队列工作者的访问,architecture,synchronization,queue,web-crawler,servicebus,Architecture,Synchronization,Queue,Web Crawler,Servicebus,我目前正在编写一个服务,它使用Steam Web API对DotA 2匹配项进行爬网。因为我希望我的解决方案是可伸缩的,所以我希望允许并行缓冲和处理爬网作业。这就是为什么会想到队列: 所有组件都应该能够在不同的计算机/虚拟机上运行(无内存内或进程间同步)。爬行作业可能是这样的: Job 1: Crawl match 1234 with options ABC Job 2: Crawl match 2345 with options BCD 由于数据的性质,指向同一匹配的多个作业可能会排队(例

我目前正在编写一个服务,它使用Steam Web API对DotA 2匹配项进行爬网。因为我希望我的解决方案是可伸缩的,所以我希望允许并行缓冲和处理爬网作业。这就是为什么会想到队列:

所有组件都应该能够在不同的计算机/虚拟机上运行(无内存内或进程间同步)。爬行作业可能是这样的:

Job 1: Crawl match 1234 with options ABC
Job 2: Crawl match 2345 with options BCD
由于数据的性质,指向同一匹配的多个作业可能会排队(例如,两个玩家玩同一个游戏)。因此,我需要一些队列无法提供的同步机制(爬虫程序不能同时尝试写入相同匹配的数据)

我的实际问题是:是否有一种模式可用于同步需要访问相同数据的队列工作者

我想到的一种方法是引入另一种服务,它允许爬虫程序
锁定匹配(这需要在从数据库读取或写入匹配数据之前完成):

但这会带来一大堆新的问题和要求:

  • 如何缩放控制器
  • 如果控制器崩溃怎么办
  • 如果队列工作程序未解锁匹配,该怎么办
如果有兴趣,我可能会使用以下技术:

  • 队列:Windows Server的服务总线
  • 服务:.NET Web API
  • 数据库:SQL Server 2012

    • 这听起来像是一个预订系统,在线订票系统存在的问题-

      user asks for tickets
      system offers specific tickets
      user thinks a while and maybe pays, during that think time system cannot offer tickets to anyone else
      eventually user buys, rejects or maybe just times out
      system updates ticket availability
      
      问题:在您的系统中,如果两个具有相同参数的爬虫同时搜索,并且无法同时更新结果,是否会出现问题? 我问这个问题的原因是,我认为爬行动作本身类似于用户思考时间,这是一个长时间运行的动作,在这个动作的持续时间内保存数据库是不合理的 锁

      我提议的方案是 乐观锁定,由数据库和数据库转换进行调解,因此不需要单独的控制器-您的数据库是一个单点故障,最终是一个可伸缩性瓶颈,但您可以通过对数据库进行一些分区来解决这一问题

      你需要某种控制器。但它不一定是单身。再次通过数据库锁调解实例。我看到的最大问题是可靠地捕获失败的爬虫程序。在“蓝天”场景中维护一个运行爬虫的DB表非常简单。在我看来,失败的案例非常棘手


      我想知道这个诀窍是否是对数据库进行分区,每个分区对应一个带有自己控制器的“工作组”。只要控制器处于活动状态,它就可以启动工作并对查询进行监控,以便在其工作组中不会出现重复的查询。任何爬虫程序完成后,“就绪”消息将排队,结果整合服务将数据从分区拉入主分区。

      这听起来像是预订系统,在线订票系统存在的问题-

      user asks for tickets
      system offers specific tickets
      user thinks a while and maybe pays, during that think time system cannot offer tickets to anyone else
      eventually user buys, rejects or maybe just times out
      system updates ticket availability
      
      问题:在您的系统中,如果两个具有相同参数的爬虫同时搜索,并且无法同时更新结果,是否会出现问题? 我问这个问题的原因是,我认为爬行动作本身类似于用户思考时间,这是一个长时间运行的动作,在这个动作的持续时间内保存数据库是不合理的 锁

      我提议的方案是 乐观锁定,由数据库和数据库转换进行调解,因此不需要单独的控制器-您的数据库是一个单点故障,最终是一个可伸缩性瓶颈,但您可以通过对数据库进行一些分区来解决这一问题

      你需要某种控制器。但它不一定是单身。再次通过数据库锁调解实例。我看到的最大问题是可靠地捕获失败的爬虫程序。在“蓝天”场景中维护一个运行爬虫的DB表非常简单。在我看来,失败的案例非常棘手


      我想知道这个诀窍是否是对数据库进行分区,每个分区对应一个带有自己控制器的“工作组”。只要控制器处于活动状态,它就可以启动工作并对查询进行监控,以便在其工作组中不会出现重复的查询。任何爬虫程序完成后,“就绪”消息排队,结果整合服务将数据从分区拉入主分区。

      如果需要关联队列中的一组消息,可以使用会话进行关联。此外,将一个主题与多个订阅一起使用是根据订阅上设置的不同筛选器对消息进行分区的一种好方法。以下信息可能会有所帮助:

    • (来自我的博客)

    • 您可能需要将上述示例中的引用更新到Azure SDK 1.8,因为它支持Windows Server Service Bus 1.0。

      如果您需要关联队列中的一组/组消息,可以使用会话进行关联。此外,将一个主题与多个订阅一起使用是根据订阅上设置的不同筛选器对消息进行分区的一种好方法。以下信息可能会有所帮助:

    • (来自我的博客)

    • 您可能需要将上述示例中的引用更新到Azure SDK 1.8,因为它支持Windows Server Service Bus 1.0。

      如果两个爬虫都将相同的数据发布到数据库中,则使用乐观锁定不会有问题。根据爬网作业的选项,爬网程序可能需要等待另一个爬网程序将数据写入数据库,然后更改某些属性(因此,
      插入
      将成为
      更新
      )。这是由Steam API的工作方式造成的,我不能偶然发现。我认为您没有提到您受到特定产品API的约束。如果这不能改变,我看不出有什么变化