【问题标题】:emails sent three times asp.net website电子邮件发送了 3 次 asp.net 网站
【发布时间】:2012-07-09 07:24:48
【问题描述】:

我正在开发一个电子商务网站,我们正在尝试解决一个问题。 客户完成订单后,她会收到三封电子邮件(全部相同)而不是一封。 该网站在三台服务器上运行,我们认为这是问题所在,因为仅使用一台服务器会将一封电子邮件发送给客户。 我想知道我们应该怎么做,这样用户将只收到一封电子邮件而不是三封,我们仍将在三台服务器上运行该网站。 在此先感谢 Laziale

【问题讨论】:

  • 这可能是一个简单的并发问题,电子邮件周围的lock(object){}.Send(与标志一起)会做吗?你在用System.Net.Mail吗?
  • 请您为我们复制/粘贴发送电子邮件代码
  • 如果您使用三台服务器对您的站点进行负载平衡,它们仍然必须进行通信以避免出现问题中的这种情况。这听起来更像是设计问题而不是代码问题。
  • 谁对邮件进行排队,邮件是如何发送的(从队列中消耗)?似乎它可能是以下两种情况之一:3 封电子邮件正在排队,或者同一队列中有 3 个消费者没有锁定。
  • 您只使用一个数据库吗?如果读取时锁定行,发送完成时设置一个标志,释放行。

标签: c# asp.net email iis web-config


【解决方案1】:

您不能指望数据库中的锁定提示。提示只是提示;无法保证锁定会按您的预期发生(假设这是 SQL Server)。一般来说,关系数据库就是这样,一个数据库。表不是一种排队机制,如果您尝试以这种方式使用它,您总会遇到问题。

尽管如此,为了实现不同的解决方案,我们必须确定是单个记录被添加到“队列”还是三个记录被添加。如果是第一个,并且只添加了一条记录但发送了三封电子邮件,那么解决方案很简单。不要使用数据库表作为队列,而是使用 Microsoft 消息队列 (MSMQ)。它们是 Windows Server 的一部分,至少从 2003 年开始就存在,甚至可以追溯到 2000 年。它们将为您提供一个专门为您想要完成的任务而设计的实际队列。

如果有三个实际记录被添加到数据库中的“队列”表中,则意味着存在代码问题。即使负载平衡器中有三台 Web 服务器,事实仍然是单个订单提交仅发生在其中一台服务器上。将电子邮件通知放入队列的业务逻辑不能来自多个服务器,因为请求仅源自一台服务器。

我会先检查表格并确定是否添加了多条记录。如果不是,请将实现更改为使用 MSMQ。如果是这样,请检查您的代码以了解为什么在请求中添加了多个记录。

【讨论】:

  • @Christoper 感谢您的详细解释。我检查了表格,只添加了一条记录。我如何更改实现以使用 MSMQ,因为现在所有数据都进入第一个表。我是否需要进行完整的代码更改才能切换到 MSMQ?谢谢
  • 是的,合并 MSMQ 将是一个完整的代码更改。您的 Web 应用程序将使用 .NET Framework 的本机方法和类将消息放置在队列中。然后,您需要创建一个监视队列的 Windows 服务。当消息到达队列的头部时,服务将自动“处理”它。根据队列上的消息数量,您可以让主线程将其交给多个工作线程,或者只处理一个线程。无论哪种方式,它都会解决您的问题,并且实际上会很好地执行和扩展。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2012-12-11
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多