【发布时间】: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