【问题标题】:Best way to handle reading DB for queued items from a daemon?处理从守护进程中读取排队项目的数据库的最佳方法?
【发布时间】:2011-06-09 06:37:05
【问题描述】:

情况: 用户提交一个 url,我的 php 脚本将该 url 添加到数据库中的“队列”表中。并假设每分钟将至少有 1000 个 url 插入到该“队列”表中。我要对 url 做的是抓取 url 的内容,然后对内容进行一些快速解析。

我的解决方案: 正在考虑创建一个守护程序,该守护程序将继续检查“队列”表并在每次检查时抓取可用的行。然后处理检索到的数据,从另一个表更新数据,然后在该循​​环完成时删除行,然后再次重复。每行可能需要 1ms-3ms 才能完成。 (顺便说一句,我正在使用 InnoDB 表)

问题:那么您认为这是一个很好的方法吗?还是有更好的东西? - 不过,我不想使用任何繁重的系统,如果可能的话,我想保持简短和简单:)

【问题讨论】:

    标签: php queue daemon


    【解决方案1】:

    我会说您当时只抓取 1 行而不是所有行。原因如下:

    假设您的表中有 1000 个条目,您的脚本来了,将所有 1000 个放在内存中(警告标志 1 表示内存使用率高)并开始处理。处理 1000 个条目需要 5 分钟,但您的脚本每 3 分钟运行一次。这意味着当您的第一个线程处理第 674 行(例如)时,您的第二个线程开始处理第 1 行,因为您的数据库尚未更新(警告标志 2:多线程行为) .

    这也适用于让多个线程同时运行队列的情况。

    申请流程:

    • 脚本启动,获取带有“未处理”标志的第一行
    • 立即将其标志设置为“处理”
    • 处理该 URL
    • 将标志设置为“已处理”

    除了使用标志之外,您还可以在数据库中使用行锁定。但是这样很容易出现死锁,所以要小心。

    【讨论】:

    • 谢谢,这似乎是合理的。但是它不会导致数据库上的更多负载保持一次抓取一行吗?或者考虑到 InnoDB 使用行级锁定,这可以吗?
    • 我认为您的服务器不会一直受到抓取行的影响,它就是这样做的。但是,如果您有索引列,则一直更新和/或插入会导致更大的负载,因此请记住这一点。
    【解决方案2】:

    一般来说,这种方法会奏效。虽然我建议您保持队列完整并使用表格来跟踪每个项目的进度。

    【讨论】:

    • 我不明白你所说的“保持……队列完整”是什么意思?
    • 不要删除行。将它们作为日志保存并跟踪工作状态。
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2010-11-15
    • 2013-09-22
    • 1970-01-01
    • 2016-12-21
    • 2016-05-17
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多