处理排队的长时间运行流程的服务 - 从哪里开始?

时间:2010-09-05 05:22:52

标签: .net windows-services queue batch-processing

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

  1. 用户将401k数据上传到网络
  2. 数据进入处理队列(数据库表)
  3. 处理401k(每个客户可能需要几分钟)
  4. 通过电子邮件通知用户已接受401k
  5. 我们当然可以编写一个服务来处理这个问题,但是如果服务失败怎么办?如何通知某人?如果有例外怎么办?此外,此服务是否应处理其他非用户启动的进程(如发送电子邮件等)。

    我们拥有一支技术精湛的.NET开发人员团队,但我们所有的经验都来自任务调度程序启动的Web /客户端应用程序或控制台应用程序,因此您可以提供任何方向。

2 个答案:

答案 0 :(得分:1)

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

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

您对潜在失败的其他担忧可能是另一项服务,或者可能是您网站中的投票机制。读取DB以获取上次处理的消息的日期时间。读取“等待”的项目数。如果数字不理想,请发送电子邮件给管理员/客户/等。必要时。

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

@Jess :明白你正试图覆盖基地。一个正确的队列将有助于它不会使用请求锤击您的数据库。您的应用/项目/客户的规模将决定这是否是一个问题。实际上,你可以把这一切都扔进Page_Load中的单个.aspx,但你肯定知道的更好。

Re:矫枉过正。我读到了一个问题,即对停机时间以及此类应用程序如何处理此问题存在一些担忧。开箱即用的Web服务不会:

  • 很好地处理数据库中断,因为它依赖于DB来保存其工作的输出。这是'捕手','工人'和'结果'一气呵成。这真的属于DMZ吗?注意项目1:“Web”,而不是内联网。

  • 无需添加更多Web +工作节点即可进行扩展。

这个建议的解决方案涉及:

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

  • 异步处理。您的Web层可以简单地“捕获”请求,并“放入”队列。而已。没有激活线程,不依赖于应用程序数据库。它可以回到接收来自其他用户的请求的工作。用户不必“感觉”繁忙工作日的滞后。

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

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

  • 安全性 - 在内联网或互联网解决方案中,这是不是100%清楚。如果是网络暴露,那么请考虑如何将消息从DMZ发送到您的内部应用程序。你能证明从开放的互联网读写你的应用程序数据库是正确的吗?考虑某种外观。队列提供了这个。

答案 1 :(得分:0)

如果您的体验是在网络应用中,请在网络应用中进行。您可以在Web服务的上下文中完成处理,而不是单独使用。

修改

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

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