【问题标题】:MySql / MSSQL - Checking out Records for Processing - Scaling?MySql / MSSQL - 检查记录以进行处理 - 缩放?
【发布时间】:2010-11-25 15:44:41
【问题描述】:

我试图找出在 sql 数据库中实现处理队列机制的最有效和可扩展的方法。简而言之,我有一堆带有相关“反向链接”统计信息的“域”对象。我想有效地确定哪些域需要处理其反向链接。

表:id, domainName

Backlinks 表:id、domainId、count、checkedTime

反向链接表有许多记录(以保留历史记录)到一个域记录。 我需要有效地选择要处理其反向链接的域。这可能意味着最近 checkTime 的 Backlinks 记录在过去已经足够远,或者域记录根本没有 Backlinks 记录。处理域需要按多种因素进行排序,包括按最旧的checkedTime 优先排序。

有多个“阅读器”处理域。如果同一个域被处理两次,这不是什么大问题,但这是对 CPU 周期的浪费。

worker 处理域的时间不确定。我宁愿有一些备份,因为结帐会“过期”,而不是要求工作进程在完成时明确“签入”记录,以防工作人员因某种原因失败。

这里的大问题是缩放。从一开始,我就可以轻松拥有大约 200 万个域,而且这个数字每天都在增长。这意味着我的反向链接历史也会快速增长,因为我希望在某些情况下每天处理,而在其他情况下每周处理每个域。 问题变成了,找到需要反向链接处理的域的最有效方法是什么?

感谢您的帮助!

【问题讨论】:

  • 您检查旧反向链接和不存在的反向链接的业务规则是什么?哪个更迫切需要验证?
  • 在这种情况下,检查尚不存在的反向链接将被视为更高优先级...

标签: mysql sql-server tsql scaling checkout


【解决方案1】:

我决定以不同的方式组织事情。我没有根据几个表的标准来查找需要处理的域,而是分配了一个日期,在该日期需要为给定域处理每个指标。这使得查找需要处理的域的查询变得更加简单。

我最终使用了批处理的想法,我在其中找到要处理的域,将它们标记为由批处理 id 处理,然后将这些域返回给工作人员。当worker完成后,返回结果,batch被删除,域自然会准备好以后再次处理。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多