Web应用程序架构:未来打样

时间:2009-01-22 18:09:25

标签: php database web-applications cron

我有一个当前发送电子邮件的网络应用程序。当我的Web应用程序发送电子邮件(发送电子邮件是基于用户操作 - 不是自动的)时,它必须运行其他过程,如压缩文件。

我正在努力使我的应用程序“面向未来” - 所以当有大量用户时我不希望服务器紧张,所以我认为需要发送需要发送的电子邮件和需要的文件被压缩成一个队列。将它们放在表中,然后使用cron作业检查每一秒并执行它们(一次x行)。

以上是个好主意吗?还是有更好的方法?我真的需要帮助才能妥善完成这项任务,以便以后节省自己的头痛:)

全部谢谢

7 个答案:

答案 0 :(得分:6)

这是一个很好的方法,但是你现在可以做的最重要的事情是有一个清晰的界面来排队消息,一个用于消耗队列。不要将任何一端的用法硬编码到数据库。

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

答案 1 :(得分:2)

您可能忽略的一个方面是您正在使用的压缩速度,在您的拉链过程中使用较轻的压缩级别可能符合您的最佳利益,因为这可以大大改进拉链时间(轻松加倍),这可以添加当你进入多个用户的领域时,会有很多。

如果你使用压缩文件(MP3,ZIP,DOCX,XLSX,JPG,GIF等)并使用高压缩(如果你有简单的文本文件),那么你可以更好地使用压缩智能并且不使用压缩( TXT,XML,DOC,XLS等)因为即使压缩也会非常快速地压缩。

答案 2 :(得分:1)

重要的一点可能是,不是让cron作业每秒运行一次,而是让一个始终运行的守护进程在退出时自动重启 - 或类似的东西。

一个原因是,正如您自己描述的那样,如果很多用户请求发送电子邮件并且队列建立起来,那么一个cronjob将没有时间在ext一个统计数据之前进行芬兰语,并且您可能会有你的系统充满了流程。

答案 3 :(得分:1)

以上是个好主意吗?是

是否可以有更好的解决方案来处理数百万用户?可能......但那并不重要。重要的是你已经构建了抽象层。如果有一天你有疯狂的流量,你的cron队列没有跟上,你可以替换该层的功能,而无需更改任何使用它的代码。

答案 4 :(得分:1)

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

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

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

-
BMB

答案 5 :(得分:1)

构建分布式排队的东西。缩放音量时,您可以缩放可能出现瓶颈的层的不同层。

有没有理由每秒运行一次cron?音量那么高吗?我会说尽力保持它的n层实现,因为你会交换进出的内容并重构比特,因为它们会引起你的注意。

尽量不要在几周内制作任何你设计的东西。在事情被锁定之前,通常会遇到其他情况。

答案 6 :(得分:1)

好方法。一些改进:

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