1

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

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

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

可能的解决方案:

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

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

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

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

4

1 回答 1

0

您可能想看看NServiceBus

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

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

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

该代码目前在他们的开发分支中。可以在此处找到演示所有这些的示例。

有关更多详细信息,请参见此处

于 2012-06-12T09:51:32.130 回答