ASP.NET SMTP故障转移解决方案

时间:2012-06-11 14:48:08

标签: asp.net smtp msmq rabbitmq

我对此的知识和经验是有限的,所以不确定我是否考虑过所有事情,并希望得到一些建议。

当前方案:一台Exchange服务器,一台数据库服务器,多台负载均衡的Web服务器,所有这些都定期发送确认和警报电子邮件。此交换服务器广泛用于整个业务,导致交换服务器无法处理的高负载。有一段时间,服务器停机了很长时间,导致电子邮件无法到达目的地,也没有记录电子邮件尝试确定哪些电子邮件失败,以便以后可以手动发送。此外,该网站等待SMTP响应,因此网页加载有延迟。

计划:引入第二个SMTP服务器以减少原始服务器上的负载,同时对网站进行一些改进以减少资源占用并改进所有电子邮件尝试的记录(只是标题信息),使用SMTP回应状态。

可能的解决方案:

  1. 将网站的电子邮件方法更改为日志,然后通过一台或其他服务器尝试SMTP,记录smtp响应。优点:开发更快,缺点:没有异步处理电子邮件队列。

  2. 记录电子邮件标题,然后使用MSMQ或RabbitMQ将电子邮件请求发送到队列,并拥有一个侦听器服务来处理实际将电子邮件发送到Exchange服务器的过程。此外,如果它仍然无法访问SMTP服务器,请将其保留在队列中,稍后再次重试。优点:可以重用基础架构和经验,在未来的功能要求中使用MQ,例如用户请求下载数据,Facebook。缺点:时间学习如何做,并在面临最后期限时实际发展。

  3. 将电子邮件记录到数据库,然后发送到本地提取文件夹,该文件夹中继到Exchange服务器,但我认为这没有故障转移支持或更新电子邮件日志状态的方法,所以虽然看起来很快设置,并没有真正满足我所能看到的所有要求。

  4. 我最想做的是分两个阶段开发,最初只是第一个解决方案然后开发MSMQ / RabbitMQ功能以使其在以后异步,但我想我会征求意见,看看是否我忽视了一些事情。

1 个答案:

答案 0 :(得分:0)

您可能需要查看NServiceBus

具体来说,有一些非常新的电子邮件功能。已经创建了一个卫星,为您提供NServiceBus重试的好处,使您的电子邮件发送更加强大。

您可以获得单独的队列,而无需新端点或配置任何消息映射。这样,每个端点都内置了此功能,并且唯一需要的配置是SmtpClient配置部分。

此功能的API为Bus.SendEmail(new MailMessage)。他们使用System.Net.Mail.MailMessage作为发送电子邮件的抽象。

代码目前位于develop branch。可以找到展示所有这些内容的示例here

有关详细信息,请参阅here