我想通过邮件通知卖方,买方即将来临(提货时间前2小时)。
我通常会使用CRON和数据库表来完成此操作。每小时检查一次,如果我发现取货时间为2小时以下的订单,则仅将邮件发送出去。
现在,我想知道您是否建议使用排队作业发送邮件。
使用
$when = now()->addDays(10); //I would dynamically set the date
Mail::to($order->seller())
->later($when, new BuyerIsComing($order));
我可以延迟发送排队的电子邮件。
但是这有多安全?尤其是,如果有人在点东西但要收拾东西,让我们夸大两个月?
Laravel排队系统是否足够坚固,可以在长时间的延迟(即2个月)后正确运行?
修改
我正在使用Redis进行排队
答案 0 :(得分:2)
您实际上不必担心。发送邮件通常会增加应用程序的响应时间,因此延迟发送是一件好事。
队列是解决问题的方法,在Laravel中很容易设置。 Laravel开箱即用地支持其中的几个。我建议您从数据库开始,然后尝试beantalk等。
最后,更重要的是,使用诸如Supervisor之类的流程管理器来监视和维护您的队列工作者...
请查看https://laravel.com/docs/5.7/queues,以获取更多见解。 干杯。
答案 1 :(得分:1)
如果安全的话,您的意思是可靠的,则与立即发送电子邮件没有什么不同。如果您的服务器有可能“打ic”并且不发送电子邮件,那么这种可能性与现在的10分钟相同。作业进入队列后,它将一直保留到完成(除非您使用基于内存的驱动程序,例如Redis,如果服务器重新启动,该驱动程序可能会重置)。
如果使用数据库队列驱动程序或远程服务器,即使服务器在短时间内不可用,仍将保留排队作业的日志。即使您要发送作业的确切时间戳已过期,您的队列也将受到尊重。例如,如果您计划在下午1:00发送电子邮件,但服务器恰好在该时间关闭,则当它重新联机时,仍会看到该作业,因为它存储为不完整,并且作业时间已过去,这将在您的队列工作者下次检查作业列表时触发作业的执行。
当然,这是假设您已将队列工作器设置为始终检查作业并自动重启,即使在服务器故障后也是如此,但这与很多解决方案不同,例如{{3} }。
答案 2 :(得分:1)
如果您将数据库驱动程序与Laravel队列一起使用来处理电子邮件,则无需担心任何事情。
仅在成功完成作业后才将其从作业表中删除,否则将设置其下一次尝试时间(即未来几分钟)并再次执行(如果您的队列工作者在线)。
因此使用Laravel队列完全安全