1

构建服务以处理排队的长时间运行进程的最佳方法是什么?例如,这就是我们正在尝试做的

  1. 用户上传 401k 数据到网络
  2. 数据进入处理队列(数据库表)
  3. 401k 已处理(每个客户端可能需要几分钟)
  4. 通过电子邮件通知用户 401k 已被接受

我们当然可以编写一个服务来处理这个问题,但是如果服务失败了怎么办?如何通知某人?如果有异常怎么办?此外,该服务是否应该处理其他非用户启动的进程(如发送电子邮件等)。

我们拥有一支由熟练的 .NET 开发人员组成的团队,但我们所有的经验都是在由任务调度程序启动的 Web/客户端应用程序或控制台应用程序方面的,因此您可以提供任何指导,我们将不胜感激。

4

2 回答 2

1

考虑将 MSMQ ( System.Messaging) 用于此任务。也许是这样的流程:

  • 用户将数据上传到网站。
  • 数据写入 MSMQ。
  • 在间隔n中,Windows 服务从队列中窥视/读取下一条等待消息。
  • 工作由服务完成,数据写入数据库,然后将另一条消息发送到另一个队列以通知客户。
  • 另一个服务从第二个队列中窥视/读取。根据需要向客户发送电子邮件/通知。建议需要这个第2个队列来处理SMTP中断等,并且可以独立于第1个队列进行管理。

您对潜在故障的其他担忧可能是另一种服务,或者可能是您网站中的轮询机制。读取数据库以获取最后处理的消息的日期时间。阅读“等待”的项目数。如果数字不令人满意,请发送电子邮件给管理员/客户/等。有必要的。

使用 MSMQ 意味着您可以使用拉系统,并且不必通过轮询每个n来对数据库进行轮询来增加数据库和网络的负担。消息发送都是事务性的,因此您完全不必担心丢失/未确认的消息。

@Jess:了解您正在尝试覆盖基地。一个适当的队列会有所帮助,因为它不会用请求锤击您的数据库。您的应用程序/项目/客户的规模将决定这是否是一个问题。实际上,您可以将所有这些都放入 Page_Load 中的单个 .aspx 中,但您肯定知道得更清楚。

回复:矫枉过正。我“读懂”了这样一个问题,即对停机时间以及这样的应用程序如何处理这个问题存在一些担忧。开箱即用的 Web 服务不会:

  • 很好地处理数据库中断,因为它依赖于数据库来保存其工作的输出。它是“捕手”、“工人”和“结果者”,合而为一。这真的属于非军事区吗?注意第 1 项:“Web”,而不是 Intranet。

  • 在不添加更多 web+worker 节点的情况下进行扩展。

这个建议的解决方案包括:

  • MSMQ 有自己的存储实现,因此它不依赖于您的应用程序数据库进行排队和交付顺序。它是 Windows 的一部分,作为服务运行。如果 MSMQ 已关闭,则 Windows 已关闭,或者安全配置不正确。

  • 异步处理。您的 Web 层可以简单地“捕获”请求,然后“放入”队列。就是这样。没有旋转线程,不依赖应用程序数据库。它可以重新开始接收其他用户的请求。用户不必“感觉”忙碌工作日的滞后。

  • 可扩展性。您可以将您的 Windows 服务部署到 1 台以上的机器上工作。

  • 工作分离:401k 处理、电子邮件、请求处理 + 身份验证都在不同的模块中。

  • 安全性——在 Intranet 或 Internet 解决方案中,这不是 100% 清楚的。如果在 Internet 上公开,请考虑如何将消息从 DMZ 发送到内部应用程序。您能否证明从开放互联网对您的应用程序数据库进行读写访问是合理的?考虑某种门面。队列提供了这个。

于 2010-09-05T05:35:08.497 回答
0

如果您的经验是在 Web 应用程序中,请在 Web 应用程序中进行。您可以在 Web 服务的上下文中而不是在它自己的上下文中完成您的处理。

编辑

显然我不够清楚。IIS 提供 ASP.NET 和静态内容,但它也是托管处理数据库中作业的轮询线程的理想场所。我称之为理想,因为它可以更新可以显示在内部网页中的静态变量,并且可以从 IIS 提供的所有日志记录、重置和其他基础设施中受益。这避免了创建一个单独的服务来运行一个线程的所有复杂性,然后必须处理该解决方案的成本。

我已经这样做了几次,效果很好。

于 2010-09-05T08:25:32.040 回答