我在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个线程的工作池可以执行这些子任务。每次有一个自由工作者(空闲线程)时,选择具有最大数量对象的数据类型(例如:数据库中有5个链接,2个二进制数据和6个已解析文档,然后"解析文档& #34;选择数据类型)。然后由工作人员创建并执行具有所选数据类型的子任务。
这种设计的目的是使爬虫本身的实现尽可能简单(只需要定义数据类型和子任务,其他一切包括多线程由"容器" )。
简而言之就是这样。
我很确定我不是第一个想到这个解决方案的人,但我似乎无法找到关于这个主题的任何内容。 这个设计模式有没有名称,或者任何人都可以分享一些关于它的文章?如果有一个现有的开源java实现,或者任何人都知道一个像这样工作的项目,那也不错。
答案 0 :(得分:0)
据我所知,您描述了基于消息的通信。 See for example Asynchronous Queuing
你所描述的设计让我想起了一个热水池,尽管它并不完全相同。
修改强>
在我的意见中,您所需要的一切都已由Java提供。
Java提供ThreadPools,Java提供Priority Blocking Queues。在我看来,这应该足够了。不是吗?
也许你给ProducerConsumer以及ThreadPool读一读。我希望这就足够了。