【问题标题】:asynchronous resource intensive design pattern异步资源密集型设计模式
【发布时间】:2014-05-05 12:39:18
【问题描述】:

我正在用 java 编写一个 Web Crawler,具有以下设计模式:

我将任务分成原子子任务:

- downloading
- content separation
- html parsing
- pdf parsing
- link extraction
- etc.

每个子任务都有一个预定义类型的输入,并且可以有任意数量的不同输出。可用的数据类型有:

- link
- binary data
- raw html
- raw pdf
- parsed document
- etc.

例如:“下载”任务的输入类型为链接,输出二进制数据,而“内容分离”的输入类型为二进制数据,输出“原始 html”或“原始 pdf”对象。

有一个由 N 个线程组成的工作池来执行这些子任务。每次有空闲worker(空闲线程)时,选择对象数最多的数据类型(例如:数据库中有5个链接,2个二进制数据,6个已解析文档,然后是“已解析文档”数据类型被选中)。然后,worker 会创建一个具有所选数据类型的子任务并异步执行。

这种设计的目的,是为了让爬虫本身的实现尽可能的简单(只需要定义数据类型和子任务,包括多线程在内的其他一切都由“容器”处理)。

简而言之就是这样。

我很确定我不是第一个想到这个解决方案的人,但我似乎找不到关于这个话题的任何东西。 这种设计模式有什么名字吗,或者任何人都可以分享一些关于它的文章吗?如果有一个现有的开源 java 实现,或者任何人都知道这样的项目,那也很好。

【问题讨论】:

    标签: java multithreading design-patterns asynchronous web-crawler


    【解决方案1】:

    据我所知,您描述了基于消息的通信。 See for example Asynchronous Queuing

    你描述的设计让我想起了一个热水池,尽管它并不完全相同。

    编辑

    在我看来,您需要的一切都由 Java 提供。

    Java 提供ThreadPools,Java 提供Priority Blocking Queues。在我看来,这应该足够了。不是吗?

    也许您可以阅读ProducerConsumerThreadPool。我希望这已经足够了。

    【讨论】:

    • 我在我的程序中使用异步排队,但它只是更复杂系统的一小部分。我正在寻找更接近我描述的东西。
    • @Kicsi 您能否具体说明您正在寻找什么?我以为您会寻找该工作池的实现?还是您正在寻找爬虫的实现?
    • 我正在寻找的是一个框架/容器,我只需要定义子任务和数据类型,一切都按照我的描述工作。我不一定要寻找一个实现,任何证明 some1 在我之前做到这一点的证据都很好(只需要一个搜索的起点:))。实施这个系统并不难,但测试它并找出所有可能的错误/缺点并对其进行微调通常是一个漫长的痛苦过程,如果可能的话,我希望避免。
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多