Web crawler 消息队列:哪种情况最好?

Web crawler 消息队列:哪种情况最好?,web-crawler,message-queue,Web Crawler,Message Queue,我写了一个网络爬虫 爬虫程序有两个步骤: 获取html页面 然后解析页面 我想使用消息队列来提高性能和吞吐量 我认为有两种情况: 情景1: urlProducer:获取目标url并将其添加到队列1 urlConsumer:根据作业信息,获取html页面并将其添加到queue2 parserConsumer:根据作业信息,解析页面 情景2: urlProducer:获取目标url并将其添加到队列1 urlConsumer:根据作业信息,获取html页面并将其写入db parserProducer

我写了一个网络爬虫

爬虫程序有两个步骤:

  • 获取html页面
  • 然后解析页面
  • 我想使用消息队列来提高性能和吞吐量


    我认为有两种情况:

    情景1: urlProducer:获取目标url并将其添加到队列1

    urlConsumer:根据作业信息,获取html页面并将其添加到queue2

    parserConsumer:根据作业信息,解析页面

    情景2: urlProducer:获取目标url并将其添加到队列1

    urlConsumer:根据作业信息,获取html页面并将其写入db

    parserProducer:从db获取html页面并将其添加到queue2

    parserConsumer:根据作业信息,解析页面


    每个结构中都有多个生产者或消费者

    场景1喜欢连锁电话。当发生错误时,很难找到问题的症结所在

    场景2将队列1和队列2解耦。当发生错误时,很容易找到问题的症结所在

    我不确定这个概念是否正确

    哪种情况最好?还是其他情况


    谢谢~

    我认为场景1是您最好的选择,因为您不必监视数据库,这可能会降低速度。不确定您打算用什么来实现这一点,但我可以通过两种不同的方式来实现:

  • 使用卡夫卡并按照您指定的布局消费者
  • 使用storm,不依赖消息队列。本质上,您正在进行流处理

  • 还有其他方法可以做到这一点(web服务、嵌入式队列(如ZeroMQ)、其他代理等),但由于您提到了吞吐量,这两种方案将为您提供良好的吞吐量。

    我认为,如果您想使用简单的消息传递系统,第二种方案将是处理此问题的更好方法。您已经实现的三个关键任务是获取链接、从链接中获取页面以及解析它们以获取所需信息。我们需要记住,执行这些操作的速率是不同的,这取决于所获取页面的大小。最好使用中间存储,以避免排队系统阻塞


    这就是说,我同意@在这个问题上的回答,即使用风暴集群而不是简单的排队机制。Storm worker节点还可以为您定义流量控制方法,以平均速率改变不同流的流量。在这种情况下,第一种情况会更有利。因此,您的选择将取决于您计划使用什么来实现您的解决方案。

    我认为这个问题应该转移到,因为它符合
    软件架构和设计
    作为程序员主题之一的要求。
        structure: 
        urlProducer -> queue1 -> urlConsumer -> queue2 -> parserConsumer
    
        structure:
        urlProducer -> queue1 -> urlConsumer
        parserProducer-> queue2 -> parserConsumer