批量数据处理技术


techniques for bulk data processing

我正在寻找一种技术来做以下事情,我需要你的建议。我有一个巨大的(真的)表注册ID和我需要发送消息给这些ID所有者。我不能一次给很多收件人发信息,这需要一个接一个地处理。所以我想有一个脚本(php),它可以运行在许多并行实例(进程)从数据库中获得一些数量和处理它。换句话说,每个进程都需要处理特定范围的数据。我还希望停止每个进程,并能够继续从已停止的用户向尚未收到消息的另一组用户发送消息。如果可能的话?欢迎提出任何建议和建议。

您可能希望设置一个cron作业,这通常是使用PHP脚本运行大型批处理操作的最佳方法之一:

http://www.developertutorials.com/tutorials/php/running-php-cron-jobs-regular-scheduled-tasks-in-php-172/

您的cron作业需要指向一个PHP脚本,该脚本执行以下操作:

  1. 从大数据库表中选择接收者的子集标志设置为#3(如下),标识下一批要处理的
  2. 向选定的收件人发送电子邮件
  3. 保存当前工作位置成功/失败的记录(即您可以设置一个在DB中成功发送的每个收件人旁边的标志,然后在重新运行作业时不选择这些标志)

并行处理仅在服务器配置的范围内是可能的。许多服务器都可以以并行方式为页面提供服务,但这种方式也仅限于少数服务器。相反,经验法则是尽可能快地跳转到下一个请求。

关于处理数据库中非常大的数据列表。首先,您需要一个id列表,用于您正在执行的邮件:

INSERT INTO `mymailinglisttable` (mailing_id, recipient_id, senton) SELECT 123 AS mailing_id, mycontacttable.recipient_id, NULL FROM mycontacttable WHERE [insert your criterias for your contacts]

接下来,你需要使用innodb或一些聪明的逻辑来并行处理:

使用InnoDB,你可以做一些行级锁定,但不要问我怎么做,自己搜索,我根本不使用InnoDB,但我知道这是可能的。所以你阅读文档,选择并锁定一些行,发送邮件,标记为已发送,然后通过调用你自己的脚本重复这个操作。(使用AJAX或php套接字)

如果没有InnoDB,你可以简单地添加2个字段到你的数据库中,一个是正在处理的,另一个是锁住的。当您想为您的处理锁定一些地址时,请执行:

$mypid = getmypid().rand(1111,9999);
$now = date('Y-m-d G:i:s');
mysql_query('UPDATE mymailinglisttable SET mypid = '.$mypid.', lockedon = "'.$now.'" LIMIT 3');

这将为您的pid锁定3行,并且在当前时间,选择使用

锁定的行:
mysql_query('SELECT * FROM mymailinglisttable WHERE mypid = '.$mypid.' AND lockedon = "'.$now.'")

您将检索您正确锁定的3行进行处理。我倾向于使用这个版本,而不是innodb版本,因为我是用这个方法提出的,但不是因为它更性能,实际上,我确信innodb的版本要好得多,只是从来没有尝试过。

如果您习惯使用PEAR模块,我建议您看看PEAR Mail_Queue模块。

http://pear.php.net/package/Mail_Queue

有很好的文档和教程。我以前用过这个修改过的版本,给客户发了几千封邮件,还没有出现问题:

http://pear.php.net/manual/en/package.mail.mail-queue.mail-queue.tutorial.php