后台任务以特定间隔轮询外部资源

时间:2015-07-14 22:15:09

标签: asp.net .net architecture

要求:我需要创建一个后台工作者/任务,它将以特定间隔(即10秒)从外部源(消息队列)获取数据并更新数据库。需要24小时不停地运行。 ASP.NET应用程序将数据放入消息队列。

可能的解决方案:

  1. 带有计时器的Windows服务

    • 优点:从Web服务器上卸载
    • 缺点:单独部署开销,未负载均衡
  2. 使用此处描述的方法之一:background task

    • 优点:不需要分离部署,可以进行负载平衡 - 如果一台服务器发生故障,另一台服务器可以接收它
    • 缺点:Web服务器上的开销(但是,在我的情况下,最多100个并发用户并且看到Web服务器资源未得到充分利用,我认为这不会是一个问题)
  3. 问题:建议的解决方案是什么?为什么? 我正在寻找基于.net的解决方案。

1 个答案:

答案 0 :(得分:0)

除非有充分的理由,否则你不应该使用第二种选择。将后台作业与Web应用程序分离可带来许多优势:

  1. 可扩展性 - 由您决定部署服务的位置。它可以与Web应用程序共享同一服务器,或者如果您看到负载上升,可以轻松将其移动到其他服务器。
  2. 健壮性 - 如果Web应用程序或服务中存在严重错误,则不会导致其他组件崩溃。
  3. Maintanance - 是的,由于您必须调整部署过程,因此需要调整部署过程,但这就像从输出文件夹中复制所有二进制文件一样简单,您只需要执行一次。另一方面,如果您只是需要修复服务中的小错误,则无需重新部署应用程序,从而将其缩短一段时间。
  4. 虽然我建议你选择第一个选项我不喜欢计时器的想法。有一个更简单和强大的解决方案。我将使用MSMQ绑定实现WCF服务,因为它为您提供了许多开箱即用的好功能:

    1. 您不必实现轮询逻辑。启动时,服务将连接到队列,并等待新消息。
    2. 您可以轻松使用事务处理队列消息。例如,如果数据库出现问题并且您无法写入数据库,则此时正在处理的消息不会丢失。这将返回队列以便稍后处理。
    3. 您可以根据需要部署尽可能多的侦听同一队列的服务,以确保可伸缩性和可用性。 WCF将确保多个服务不处理相同的队列消息,如果服务A正在处理消息,则服务B将跳过它并获取下一个可用消息。
    4. 您可以了解有关here的许多其他功能。
    5. 我建议阅读this一篇关于WCF + MSMQ服务示例的文章,看看实现一个并使用我上面提到的功能是多么简单。完成WCF服务后,您可以easily host it in a windows service

      希望它有所帮助!