在 Laravel 中延迟邮件有多可靠?

Posted

技术标签:

【中文标题】在 Laravel 中延迟邮件有多可靠?【英文标题】:How reliable is delaying a Mail in Laravel? 【发布时间】:2019-02-21 17:08:16 【问题描述】:

我想通过邮件通知卖家,买家即将到货(提货时间前约 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 进行排队

【问题讨论】:

您在担心什么?为什么它不被认为是安全的? @Devon 我只是担心邮件没有发送。如果队列崩溃会发生什么,它是否仍然“记得”以后要做什么? 有不同的队列驱动程序可用。 【参考方案1】:

如果您使用带有 Laravel 队列的数据库驱动程序来处理您的电子邮件,那么您无需担心任何事情。

只有成功完成的作业才会从作业表中删除,否则会设置下一次尝试时间,即未来几分钟,然后再次执行(如果您的队列工作人员在线)。

所以使用 Laravel 队列是完全安全的

【讨论】:

是的,这就是我担心的地方,因为我使用的是没有作业表的 redis。但很高兴知道!【参考方案2】:

如果说安全,你的意思是可靠,那么它与立即发送电子邮件没什么不同。如果您的服务器有可能“打嗝”并且不发送电子邮件,那么现在这种可能性与现在 10 分钟后的可能性相同。一旦作业在队列中,它会一直持续到完成(除非您使用基于内存的驱动程序,例如 Redis,如果服务器重新启动,它可能会被重置)。

如果您使用数据库队列驱动程序或远程,即使服务器在短时间内不可用,排队作业的日志也会保留。即使您要发送作业的确切时间戳已过期,您的队列也将得到尊重。例如,如果您计划在下午 1:00 发送一封电子邮件,但您的服务器在那个确切时刻停机,当它重新联机时,它仍然会看到该作业,因为它被存储为不完整并且该作业的时间已经过去,这将在您的队列工作人员下次检查作业列表时触发作业的执行。

当然,这假设您已将队列工作器设置为始终检查作业并自动重新启动,即使在服务器出现故障后也是如此,但这是一个不同的讨论,有很多解决方案......例如here 所示的那些。

【讨论】:

好的,我明白了!实际上,我正在使用 Redis 进行排队。忘了告诉它。所以你会建议将它与数据库排队? 两者都有好处,但如果可靠性是您的首要任务,您可能会考虑转换。尽管如此,我认为使用 Redis 不会有任何问题。您还可以创建自己的手动数据库表来监控您发送的每封电子邮件,并确保每封最终都被发送。【参考方案3】:

您实际上没有什么可担心的。发送邮件通常会增加应用程序的响应时间,因此延迟发送是一件好事。

队列是要走的路,在 Laravel 中设置起来非常容易。 Laravel 开箱即用地支持其中的几个。我建议你从数据库开始,然后尝试 beanstalk 等。

最后,更重要的是,使用像 Supervisor 这样的流程管理器来监控和维护您的队列工作人员......

查看https://laravel.com/docs/5.7/queues 了解更多信息。 干杯。

【讨论】:

忘了说我用的是Redis。所以我想我会使用数据库来发送邮件只是为了安全。 大声笑...无论是数据库、Redis、Beanstalk 等...您应该担心的主要事情是确保您的队列工作人员不会失败。并且您可以通过使用像 Supervisor 这样的流程监视器来确保它们不会发生。如果失败,主管将重新启动您的 queue:work 进程。在某些时候,速度和可扩展性等问题对您来说会变得很重要。到时候做好进一步研究。 我会这样做的。好的很高兴知道。如果 redis 失败,仍然不清楚 redis 如何记住所有作业,因为我认为它只是基于内存而不是数据库 是的,Redis 是一种内存数据存储,但它也具有持久化数据的能力。您可以阅读他们关于数据持久性的文档以获取更多信息...redis.io/topics/persistence。您可以在开发环境中坚持使用数据库,但在生产级别,我建议您使用 Beanstalkd、RabbitMQ、SQS...这些家伙专门用于排队...

以上是关于在 Laravel 中延迟邮件有多可靠?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 如何在忘记密码中添加自定义字段

我想自学laraver,请诸位前辈给一些建议,谢谢

Larave中CSRF攻击

使用带有 Laravel PHP 的 Gmail Api 读取网站上的所有 gmail 收件箱,然后回复特定的电子邮件

laraver框架学习------工厂模型填充测试数据

larave学习笔记1-安装配置