如何设计邮箱系统?
我在一家为客户提供支持的公司工作。现在我想设计一个系统,当发生某些事件时,可以自动给客户发送邮件。这个系统会分为两个部分:一个是后台,另一个是网页界面。后台负责和网页界面沟通(这个界面主要是供内部使用,用来修改邮件模板),最重要的是,它会检查一些数据库表,然后根据检查结果发送邮件……邮件数量会很多。
现在,我在想这个系统应该怎么设计,才能够扩展,并且提供必要的性能,因为它可能需要每小时处理几千封邮件(这应该是最高峰)。我主要关心的是,这种架构应该如何考虑,以便将来如果需要的话,可以轻松扩展。
后台会使用Python,数据库用Postgres,前端可能会用Python的网页框架或者GWT(这看起来是最简单的选择)。
4 个回答
听起来你是在尝试优化批处理,也就是说,处理的重担不在网页界面上,而是在后台。这种情况通常需要用到排队架构。
比如,亚马逊提供了排队系统,如果你真的需要处理大量数据的话。这样你可以在自己这边增加多台机器来发送邮件。你可以让一台机器一次只处理大约100条信息,从队列中取出。
邮件系统的处理方式应该是异步的,所以如果你不喜欢排队,可以看看其他的异步架构。
每小时几千封邮件其实并不算多,只要你的发件服务器能及时处理这些邮件。
我建议你使用本地的邮件传输代理,比如postfix或者exim(如果需要的话,它们会通过你的外发中继发送邮件)。这个服务负责管理邮件队列、重发、退信等等。如果你想要更多“邮件列表”的功能,可以考虑加入mailman。它是用python写的,你可能见过,因为它管理了很多互联网邮件列表。
这其实是个很适合用现成软件的情况。市面上有很多开源的邮件列表管理工具,它们已经能处理大规模的邮件发送了。如果这些邮件每次都是发给同一群人的话,那你可以选择任何一个常用的邮件列表程序。
如果不是,那简单的解决办法是
$ mail address -s subject < file
每封邮件发送一次。
顺便说一下,了解一下你所在网络的上游服务提供商的政策。有些网络服务商会把大量邮件视为垃圾邮件,可能会让你感到意外地限制或暂停你的网络访问。