以下是场景和一些建议的解决方案。 有没有更好的解决方案?
有一个系统A必须“分析”大量的URL。 另一个系统B生成这些URL - 目前在数据库中大约有1000万个URL。 示例模式:
id URL has_extracted
1 abc.com 0
2 bit.ly 1
我的解决方案如下:
天真的解决方案:有一个perl脚本/进程将URL(从数据库)提供给系统B并更新has_extracted列 这种方法的问题在于它不能很好地扩展。
解决方案2:将数据库拆分为五个(或n个)表。 (我打算删除has_extracted列,因为在这种情况下它似乎是一个可伸缩性的瓶颈。)
解决方案3: 删除has_extracted列 创建另一个表来维护/跟踪每个进程跟踪的最后一个URL。
批评/提出的解决方案要求。提前谢谢。
答案 0 :(得分:1)
为什么你的幼稚解决方案不能很好地扩展?如果您正在使用批量更新并且不经常提交,则可以在任何数据库上每秒更新100万行,而无需进行任何调整。
如果要运行系统A的多个实例,可以使用哈希函数将输入数据分成组,其中系统A的每个实例仅消耗一个组。
如果系统A的实例数量恒定,例如17,您可以使用函数id%17
作为哈希函数。
答案 1 :(得分:0)
我认为这可以如下:
URL生成器生成URL并将所有URL推送到堆栈中,例如,在数据库中。或者在记忆中或你想要的地方。
URL处理器查询URL堆栈,为其提供下一个要处理的URL。 URL Stack为它们提供URL并将其标记为给定或删除它。当URL处理器处理完URL后,它再次查询URL堆栈并说它已完成处理URL1并想要处理URL2。然后,URL Stack可以从其列表中标记/删除URL1并提供URL2。
如果URL堆栈变得狭窄,您可以只对数据库进行聚类。
答案 2 :(得分:0)