我有一个网络应用,可以在他们选择的时间内全天向我的用户发送自定义电子邮件。因此,在一天中的任何特定时间,我可能不需要做任何事情,或者发送最多一万封电子邮件。
之前我用一个单独的cron作业解决了这个问题,每分钟都会开火。它会调用一个脚本来查找需要发送的下一千封电子邮件。该脚本会将它们全部标记为“正在进行中”,然后循环遍历它们,尝试发送它们。循环很重 - 调用远程API发送电子邮件,将记录更新为“已发送”,记录操作。我发现的问题是,偶尔,循环会中断,失败,服务器会闪烁,数百封电子邮件会被标记为“正在进行中”。
我现在重写了循环以获取需要发送的单个电子邮件,将其标记为“正在进行中”,发送它,将其标记为“已发送”,记录它,然后获取下一个。我跑了一分钟,就像它想要的那么多循环。但这实际上是cpu密集型的,并且看起来非常低效,有很多db调用。
我现在在想,每天的每封电子邮件都应该拥有自己的cron作业。然后我最终得到一万个或更多的工作,呼叫一个特定的网址,如http://mydomain.com/email/123/send。我担心的是,我需要更新cron作业,例如时区和用户偏好更新(“在晚上6点而不是上午10点将我的电子邮件发送给我”)。所以我是以编程方式重新编写我的crontab,可能经常。
你会如何解决这个问题?顺便说一句,你知道任何旨在解决这个问题的网络服务吗?
答案 0 :(得分:1)
10,000个cron作业将导致运行10,000个可执行文件。我怀疑这将是最少的可扩展选项。
答案 1 :(得分:0)
这取决于您的确切需求,尽管10k cron工作看起来非常糟糕,无论如何。 也许你可以有几个cronjobs,每个选择一批邮件发送,以实现并行性并避免延迟发送邮件在底部?
另外,对于“以编程方式重写我的cron”的部分,可以使用cron库。我通常使用Quartz来做这种事情,但它可能因你的需要而过于臃肿,所以也许你想使用更轻的库。