考虑将 MSMQ ( System.Messaging
) 用于此任务。也许是这样的流程:
- 用户将数据上传到网站。
- 数据写入 MSMQ。
- 在间隔n中,Windows 服务从队列中窥视/读取下一条等待消息。
- 工作由服务完成,数据写入数据库,然后将另一条消息发送到另一个队列以通知客户。
- 另一个服务从第二个队列中窥视/读取。根据需要向客户发送电子邮件/通知。建议需要这个第2个队列来处理SMTP中断等,并且可以独立于第1个队列进行管理。
您对潜在故障的其他担忧可能是另一种服务,或者可能是您网站中的轮询机制。读取数据库以获取最后处理的消息的日期时间。阅读“等待”的项目数。如果数字不令人满意,请发送电子邮件给管理员/客户/等。有必要的。
使用 MSMQ 意味着您可以使用拉系统,并且不必通过轮询每个n来对数据库进行轮询来增加数据库和网络的负担。消息发送都是事务性的,因此您完全不必担心丢失/未确认的消息。
@Jess:了解您正在尝试覆盖基地。一个适当的队列会有所帮助,因为它不会用请求锤击您的数据库。您的应用程序/项目/客户的规模将决定这是否是一个问题。实际上,您可以将所有这些都放入 Page_Load 中的单个 .aspx 中,但您肯定知道得更清楚。
回复:矫枉过正。我“读懂”了这样一个问题,即对停机时间以及这样的应用程序如何处理这个问题存在一些担忧。开箱即用的 Web 服务不会:
这个建议的解决方案包括:
MSMQ 有自己的存储实现,因此它不依赖于您的应用程序数据库进行排队和交付顺序。它是 Windows 的一部分,作为服务运行。如果 MSMQ 已关闭,则 Windows 已关闭,或者安全配置不正确。
异步处理。您的 Web 层可以简单地“捕获”请求,然后“放入”队列。就是这样。没有旋转线程,不依赖应用程序数据库。它可以重新开始接收其他用户的请求。用户不必“感觉”忙碌工作日的滞后。
可扩展性。您可以将您的 Windows 服务部署到 1 台以上的机器上工作。
工作分离:401k 处理、电子邮件、请求处理 + 身份验证都在不同的模块中。
安全性——在 Intranet 或 Internet 解决方案中,这不是 100% 清楚的。如果在 Internet 上公开,请考虑如何将消息从 DMZ 发送到内部应用程序。您能否证明从开放互联网对您的应用程序数据库进行读写访问是合理的?考虑某种门面。队列提供了这个。