我刚刚阅读了这个关于异步发送电子邮件与同步发送电子邮件的优势的优秀问题。
我完全同意单一答案得出的结论,即:将要发送的电子邮件存储在队列中,并尽快将页面返回给用户。
我当前的实现使用数据库表来存储电子邮件队列。这种方法有几个优点:
- 它非常快:将记录保存到表中不需要时间,而不是进行 API 调用(电子邮件通过 Amazon SES 发送)。
- 它是事务性的:如果出现任何问题,事务将回滚,并且我的电子邮件将永远不会发送给不会提交到数据库的帐户。
然后我实现了一个永久运行的工作,并且会定期检查(目前是 30 秒)是否有一些邮件要发送,并处理它们。
我对这个解决方案很满意,除了它不是即时的。人们通常希望在接下来的几秒钟内收到一封邮件(如果是 SMS 则更多)。
我显然可以让作业在两次运行之间暂停不超过一秒钟,但我不想因为频繁的事务而不必要地浪费服务器资源。此外,因为我的电子邮件是通过 API 调用发送的,所以我将从并发处理中受益,而我当前的实现没有这样做(它按顺序处理它们)。
是否有一些常见的解决方案仍然异步处理电子邮件,但在电子邮件发送到队列后立即开始处理?