Php Web应用程序体系结构:未来证明

Php Web应用程序体系结构:未来证明,php,database,web-applications,cron,Php,Database,Web Applications,Cron,我有一个web应用程序,目前正在发送电子邮件。在我的web应用程序发送电子邮件时(发送电子邮件是基于用户操作的,不是自动的),它必须运行其他进程,如压缩文件 我试图让我的应用程序“经得起未来的考验”——因此,当有大量用户时,我不想让服务器紧张,所以我想把需要发送的电子邮件和需要压缩的文件放在队列中。将它们放在表中,然后使用cron作业每秒检查并执行它们(一次x行) 以上是一个好主意吗?还是有更好的方法?我真的需要有人帮我把这件事做好,以免以后头疼:) 谢谢大家这是一个很好的方法,但是现在你能做的

我有一个web应用程序,目前正在发送电子邮件。在我的web应用程序发送电子邮件时(发送电子邮件是基于用户操作的,不是自动的),它必须运行其他进程,如压缩文件

我试图让我的应用程序“经得起未来的考验”——因此,当有大量用户时,我不想让服务器紧张,所以我想把需要发送的电子邮件和需要压缩的文件放在队列中。将它们放在表中,然后使用cron作业每秒检查并执行它们(一次x行)

以上是一个好主意吗?还是有更好的方法?我真的需要有人帮我把这件事做好,以免以后头疼:)


谢谢大家

这是一个很好的方法,但是现在你能做的最重要的事情是有一个清晰的用于排队消息的界面,以及一个用于使用队列的界面。不要将两端的用法硬编码为DB


稍后,如果这成为一个瓶颈,您可能希望邮件发送从另一台甚至无法访问数据库的机器上完成,因此这一微小的前期投资将为您提供以后的选择。

您可能忽略的一个方面是您使用的压缩速度,在压缩过程中使用较轻的压缩级别可能是您最感兴趣的,因为这样可以大大缩短压缩时间(很容易翻倍),当您进入多个用户的领域时,压缩时间会增加很多


如果在压缩已经压缩的大文件(MP3、ZIP、DOCX、XLSX、JPG、GIF等)时使压缩智能化,并且在压缩简单文本文件(TXT、XML、DOC、XLS等)时使用高压缩,则效果会更好因为即使压缩量很大,它们的压缩速度也会非常快。

重要的一点可能是,与其让cron作业每秒运行一次,不如让一个始终运行的守护进程在退出时自动重新启动,或者诸如此类


一个原因是,正如您自己所描述的,如果大量用户请求发送电子邮件,并且队列不断增加,那么在ext One stats之前,一个cronjob将没有时间使用芬兰语,您的系统可能会被进程淹没。

以上是一个好主意吗?对


有没有更好的解决方案来处理未来数百万的用户?可能地但这并不重要。重要的是,您已经在抽象层中进行了构建。如果有一天你遇到了疯狂的流量,而你的cron队列没有跟上,你可以在不更改任何使用它的代码的情况下替换该层的功能。

嗯。我真的不喜欢cron每秒运行一些东西的想法。这似乎太频繁了。如果您的应用程序真的需要如此快速响应,那么我认为您应该保持同步。也就是说,保持web应用程序中的处理,并寻找其他方法来降低服务器的紧张程度

如果您可以在检查之间等待更长的时间,那么最好让cron作业一次检查队列中的1项。如果有,请处理它,然后在不退出的情况下再次检查下一个。如果没有,退出,五分钟左右不要再试

然而,尽管如此,任何像样的邮件传输代理(sendmail、postfix、Exchange)都将内置排队功能。在确保意外发生时交付方面,它可能比您做得更好。在处理排队的电子邮件时,有很多事情需要考虑。我通常更喜欢在过程中尽早将出站电子邮件交给MTA

--

bmb

内置了一些分布式排队功能。当您缩放卷时,您可以缩放可能出现瓶颈的层的不同层

是否有理由每秒运行cron?音量有那么大吗?我想说的是,尽最大努力保持它是一个n层实现,因为在它们争夺您的注意力时,您将交换东西,重构位


试着在几周内不要构建任何你设计的东西。通常情况下,在事情锁定之前,你会遇到其他情况。

好方法。一些改进:

  • 不要使用cron作业,而是在计时器上查询
  • 包括一个状态标志以保持多个读写器排序
  • 读卡器应排空队列-在队列读取为空之前不要阻塞
  • 保持简单。在作者/读者的对话中加入复杂性和微妙性
    根据我的经验,这将很好地扩展

    好的,谢谢你。您是否建议我处理队列中的所有内容或其中的一些内容?请记住,所有这些时间都很关键,越快越好:)根据您的设置,最有效的方法可能是同时获取一组电子邮件作业,然后并行处理这些作业,并与运行的smtp服务器建立多个保持活动的连接。但是,这完全取决于你如何实现你的队列,以及你如何实际发送你的电子邮件。我知道,保持一个宽松的界面非常重要。当你谈论让另一台服务器发送我的邮件时,除了数据库之外,我还能用什么呢?你可以使用消息队列系统,您可以附加到针对这种插入/删除行为进行了优化的其他数据库,而不会加重其他数据库的负担,您可以将其缓冲在内存中,并刷新到随后被使用的文件中—实际上,您只是在保留选项。感谢您的宝贵建议,特别是最后一行。:)很高兴它有用。顺便说一句,最后一行是最难做的。我几乎等不了一两个星期。当我能够做到的时候,我得到了丰厚的回报。