【问题标题】:Email message queue - X workers and stopping overlap电子邮件消息队列 - X 工人和停止重叠
【发布时间】:2011-07-18 19:51:36
【问题描述】:

当我的网站周围发生事件时,我在 MySQL 表中加载了大量电子邮件。随时可能有 1k-2k 等待发送。

我一直致力于批量处理电子邮件集并通过一名工作人员将它们发送出去。现在,随着负载的增加,我希望将 X 个工作人员添加到系统中。

我的问题是关于不允许员工获取相同的电子邮件。我听说过以下选项。

  1. 使用 SELECT FOR UPDATE 锁定行
  2. 使用时间戳让工作人员知道它已被占用以及何时被占用
  3. 让家长跟踪孩子并委派工作

我看到了这些中的每一个的价值,但也看到了对数据库的大量读/写。那你会怎么做呢?

通过 PHP 和 MySQL 实现这一点

【问题讨论】:

    标签: php mysql email queue


    【解决方案1】:

    另一个快速而肮脏的选择,假设您有一个随机或结构化的主键,让 N 个工作人员中的每个人只接收 key%N==ii 工作人员 ID 的邮件。

    您当然也可以采用其他一些足够随机的哈希值。不需要锁定,不需要额外的协调,只是一个工人死了而你没有注意到的小问题......

    【讨论】:

    • 这是个好主意。每个工人只能抓取可整除的 id。
    • 所以这对我来说很有意义,但我显然遗漏了一些东西。由于工人 2 和工人 3 都可以访问数据库中的 id 6。
    • 这是模运算符,例如有 3 个工人,工人 0 需要 id=0,3,6,9,12,...,工人 1 需要 id=1,4,7,10,13,... 工人 2 需要 id=2,5,8,11,...。如果您的 id 中有结构(例如,如果您有自定义的 auto_increment 间隔),则必须格外小心。
    • 您在什么情况下使用“工人”这个词?我有一个类似的问题。我正在使用 Gearman,但 Gearman 工作人员没有 ID。
    猜你喜欢
    • 2015-06-18
    • 2021-02-06
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2015-05-15
    • 2011-01-19
    • 2019-02-08
    • 2011-09-12
    相关资源
    最近更新 更多