后台任务以一定的时间间隔轮询外部资源
Background task polling external resource at certain intervals
要求:我需要创建一个后台worker/task,它将以一定的时间间隔(即10s)从外部源(消息队列)获取数据并更新数据库。需要 运行 24 小时不间断。 ASP.NET 应用程序正在将数据放入消息队列。
可能的解决方案:
Windows 带计时器的服务
- 优点:减轻 Web 服务器的负担
- 缺点:单独的部署开销,不平衡负载
使用此处描述的方法之一:background task
- 优点:不需要分离部署,可以负载均衡——如果一台服务器宕机,另一台可以接起来
- 缺点:网络服务器的开销(但是,在我最多有 100 个并发用户的情况下,看到网络服务器资源未得到充分利用,我认为这不是问题)
问题:推荐的解决方案是什么?为什么?
我正在寻找基于 .net 的解决方案。
你不应该选择第二个选项,除非有充分的理由。将后台作业与 Web 应用程序分离带来许多优势:
- 可扩展性 - 将服务部署在何处由您决定。它可以与 Web 应用程序共享同一个服务器,或者如果您看到负载上升,您可以轻松地将它移动到不同的服务器。
- 稳健性 - 如果 Web 应用程序或服务中存在严重错误,这不会导致其他组件宕机。
- 维护 - 是的,有一点开销,因为您必须调整部署过程,但这就像从输出文件夹复制所有二进制文件一样简单,您只需执行一次。另一方面,如果您只需要修复服务中的一个小错误,则不必重新部署应用程序从而将其关闭一段时间。
- 等等
虽然我建议您选择第一个选项,但我不喜欢带有计时器的想法。有一个更简单和强大的解决方案。我将使用 MSMQ 绑定实现 WCF 服务,因为它为您提供了许多开箱即用的好功能:
- 您不必实施轮询逻辑。启动时,服务将连接到队列并等待新消息。
- 您可以轻松地使用事务来处理队列消息。例如,如果数据库出现问题而您无法写入,此时正在处理的消息不会丢失。这将返回队列以供稍后处理。
- 您可以根据需要部署任意数量的侦听同一队列的服务,以确保可伸缩性和可用性。 WCF 将确保同一队列消息不会被多个服务处理,即如果服务 A 正在处理一条消息,服务 B 将跳过它并获取下一条可用消息。
- 您可以了解许多其他功能 here。
我建议阅读this article for a WCF + MSMQ service sample and see how simple it is to implement one and use the features I mentioned above. As soon as you are done with the WCF service you can easily host it in a windows service。
希望对您有所帮助!
要求:我需要创建一个后台worker/task,它将以一定的时间间隔(即10s)从外部源(消息队列)获取数据并更新数据库。需要 运行 24 小时不间断。 ASP.NET 应用程序正在将数据放入消息队列。
可能的解决方案:
Windows 带计时器的服务
- 优点:减轻 Web 服务器的负担
- 缺点:单独的部署开销,不平衡负载
使用此处描述的方法之一:background task
- 优点:不需要分离部署,可以负载均衡——如果一台服务器宕机,另一台可以接起来
- 缺点:网络服务器的开销(但是,在我最多有 100 个并发用户的情况下,看到网络服务器资源未得到充分利用,我认为这不是问题)
问题:推荐的解决方案是什么?为什么? 我正在寻找基于 .net 的解决方案。
你不应该选择第二个选项,除非有充分的理由。将后台作业与 Web 应用程序分离带来许多优势:
- 可扩展性 - 将服务部署在何处由您决定。它可以与 Web 应用程序共享同一个服务器,或者如果您看到负载上升,您可以轻松地将它移动到不同的服务器。
- 稳健性 - 如果 Web 应用程序或服务中存在严重错误,这不会导致其他组件宕机。
- 维护 - 是的,有一点开销,因为您必须调整部署过程,但这就像从输出文件夹复制所有二进制文件一样简单,您只需执行一次。另一方面,如果您只需要修复服务中的一个小错误,则不必重新部署应用程序从而将其关闭一段时间。
- 等等
虽然我建议您选择第一个选项,但我不喜欢带有计时器的想法。有一个更简单和强大的解决方案。我将使用 MSMQ 绑定实现 WCF 服务,因为它为您提供了许多开箱即用的好功能:
- 您不必实施轮询逻辑。启动时,服务将连接到队列并等待新消息。
- 您可以轻松地使用事务来处理队列消息。例如,如果数据库出现问题而您无法写入,此时正在处理的消息不会丢失。这将返回队列以供稍后处理。
- 您可以根据需要部署任意数量的侦听同一队列的服务,以确保可伸缩性和可用性。 WCF 将确保同一队列消息不会被多个服务处理,即如果服务 A 正在处理一条消息,服务 B 将跳过它并获取下一条可用消息。
- 您可以了解许多其他功能 here。
我建议阅读this article for a WCF + MSMQ service sample and see how simple it is to implement one and use the features I mentioned above. As soon as you are done with the WCF service you can easily host it in a windows service。
希望对您有所帮助!