3

我有一个网络应用程序,可以在一天中向我的用户发送定制的电子邮件,有时是他们选择的。因此,在一天中的任何特定时间,我可能什么都不做,或者发送多达一万封电子邮件。

以前我通过一个 cron 作业解决了这个问题,每分钟触发一次。它会调用一个脚本来查找接下来需要发送的一千封电子邮件。该脚本会将它们全部标记为“进行中”,然后遍历它们,尝试发送它们。循环很重 - 调用远程 API 发送电子邮件,将记录更新为“已发送”,记录操作。我发现的问题是,有时循环会中断、失败、服务器会闪烁,并且数百封电子邮件会卡住并标记为“进行中”。

我现在重写了循环以获取需要发送的单个电子邮件,将其标记为“进行中”,将其发送,将其标记为“已发送”,记录它,然后获取下一封。我运行它一分钟,想多少循环就多少。但这确实是 cpu 密集型的,而且似乎效率很低,有很多 db 调用。

我现在在想,每封每日电子邮件都应该有自己的 cron 工作。然后我最终得到了一万个或更多的工作,调用一个特定的 URL,比如http://mydomain.com/email/123/send。我在这里担心的是,我需要更新 cron 作业,例如时区和用户偏好更新(“在下午 6 点而不是上午 10 点向我发送电子邮件”)。所以我正在以编程方式重写我的 crontab,而且可能经常重写。

你将如何解决这个问题?顺便说一句,您知道任何旨在解决此问题的 Web 服务吗?

4

2 回答 2

1

10,000 个 cron 作业将导致 10,000 个可执行文件运行。我怀疑这将是您可用的可扩展性最低的选项。

于 2012-10-04T11:38:54.513 回答
0

这取决于您的确切需求,尽管 10k cron 作业看起来非常糟糕,无论如何。也许你可以有几个 cronjobs,每个选择一批邮件发送,以实现并行性并避免延迟发送底部的邮件?

此外,对于“以编程方式重写我的 cron”的部分,有可用的 cron 库。我通常使用Quartz 来做这种事情,但它可能对你的需求来说太臃肿了,所以也许你想使用一个更轻的库。

于 2012-10-04T11:46:48.127 回答