Web Crawler中如何使用Message Queue?
How to use Message Queue in Web Crawler?
Web Crawler 与位于不同机器上的多个 Worker 一起工作,因此,作为集成层的 Message Queue 似乎非常适合。
但问题是我不知道该怎么做。
没有 MQ 架构看起来如下 - 有一个共享数据库,Worker 在数据库中查找下一个 url 来处理,处理它并更新数据库。
但是,如何使用 MQ 来实现呢?假设要处理的站点的url存储在DB中,是否应该全部放到Message Queue中供Worker消费?
如果有 100 000 个这样的 url 和 100 个这样的站点怎么办?我应该一次将 100 000 000 个对象放入消息队列吗?或者应该有某种背压 - 比如 - 我把 100 url 放在队列中,等到所有的都被处理,然后再放下一个 100 等等?
或者,也许这样的用例不适合消息队列?
Message Queue 是一个很好的模式,可以在您有工作人员/后台作业时使用。
但通常当延迟很重要或者您有多个不同的源要收听时,您通常需要使用它(在这种情况下,队列通常比数据库访问更快/更好地实现)。
巨大的优势是能够控制流量,例如使用背压,正如您提到的那样。
我认为将数百万个对象保持在队列中不是问题,它们已为此进行了优化。例如,ActiveMQ 有一个分页缓存。
同时,如果你用的是靠谱的数据库,又不需要管流的话,用数据库应该也可以吧。
所以这取决于您的用例:
- 如果您的流程很简单,例如只有一个应用程序生成要解析的 URL,请使用数据库。
- 如果您有多个不同的来源,请使用 Message Queue and/or低延迟是您的目标。
Web Crawler 与位于不同机器上的多个 Worker 一起工作,因此,作为集成层的 Message Queue 似乎非常适合。
但问题是我不知道该怎么做。
没有 MQ 架构看起来如下 - 有一个共享数据库,Worker 在数据库中查找下一个 url 来处理,处理它并更新数据库。
但是,如何使用 MQ 来实现呢?假设要处理的站点的url存储在DB中,是否应该全部放到Message Queue中供Worker消费?
如果有 100 000 个这样的 url 和 100 个这样的站点怎么办?我应该一次将 100 000 000 个对象放入消息队列吗?或者应该有某种背压 - 比如 - 我把 100 url 放在队列中,等到所有的都被处理,然后再放下一个 100 等等?
或者,也许这样的用例不适合消息队列?
Message Queue 是一个很好的模式,可以在您有工作人员/后台作业时使用。
但通常当延迟很重要或者您有多个不同的源要收听时,您通常需要使用它(在这种情况下,队列通常比数据库访问更快/更好地实现)。
巨大的优势是能够控制流量,例如使用背压,正如您提到的那样。
我认为将数百万个对象保持在队列中不是问题,它们已为此进行了优化。例如,ActiveMQ 有一个分页缓存。
同时,如果你用的是靠谱的数据库,又不需要管流的话,用数据库应该也可以吧。
所以这取决于您的用例:
- 如果您的流程很简单,例如只有一个应用程序生成要解析的 URL,请使用数据库。
- 如果您有多个不同的来源,请使用 Message Queue and/or低延迟是您的目标。