2012-06-11 73 views
1

我对此的知识和经验有限,所以不确定我是否考虑了所有内容并希望得到一些建议。ASP.NET SMTP故障转移解决方案

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

计划:将引入第二台SMTP服务器,以减少原始服务器上的负载,同时对网站实施一些改进以减少资源浪费并改进所有电子邮件尝试的日志记录(只是标题信息), SMTP响应状态。

可能的解决方案:

  1. 更改网站的电子邮件方式登录,然后通过一个或其他服务器尝试SMTP,记录SMTP响应。优点:开发速度更快,缺点:没有电子邮件队列的异步处理。

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

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

什么我很想做的是做的是分两个阶段发展,最初只是第一个解决方案可以开发MSMQ/RabbitMQ的功能,使之异步在稍后的日期,但想到我会问意见,看看我是否忽略了一些事情。

+0

是否有一个要求,为您选择使用Exchange ** **所有电子邮件?如果没有,您可以/应该查看有能力为您的消息传递需求排队并进行故障转移的外部服务。我可以想象,如果服务器执行“所有事情”(垃圾邮件/反X等),您的服务器就会受到负载。如果可能的话,考虑外包你可以...... – EdSF

+0

这将是一个很好的解决方案通常,但不幸的是这是一个客户端,他们通过自己的服务器,而不是外包他们的电子邮件。 –

+0

如何确定哪些电子邮件只能使用IIS SMTP服务器与Exchange - 例如网站电子邮件,交易电子邮件等 - 您的每个Web服务器都可能位于SMTP服务器池中。我仍然想弄清楚哪些**必须**使用Exchange与其他MTA ...... – EdSF

回答

0

你可能想看看NServiceBus

特别是,有一些非常新的电子邮件功能。卫星已经创建,可以让您获得NServiceBus带来的重试优势,使您的电子邮件发送更加稳健。

您将获得一个单独的队列,而不需要新的端点或配置任何消息映射。通过这种方式,每个端点都具有内置的此功能,并且所需的唯一配置是SmtpClient配置部分。

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

该代码当前处于其develop branch中。展示所有这些的示例可以在here找到。

欲了解更多详情,请参阅here