【问题标题】:Background task polling external resource at certain intervals后台任务每隔一定时间轮询外部资源
【发布时间】:2015-07-23 00:44:38
【问题描述】:

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

可能的解决方案:

  1. 带计时器的 Windows 服务

    • 优点:减轻 Web 服务器的负载
    • 缺点:单独的部署开销,没有负载平衡
  2. 使用此处描述的方法之一:background task

    • 优点:无需分离部署,可以进行负载平衡 - 如果一台服务器出现故障,另一台服务器可以将其接起
    • 缺点:网络服务器的开销(但是,在我的情况下,最多 100 个并发用户并且看到网络服务器资源未得到充分利用,我认为这不是问题)

问题:推荐的解决方案是什么?为什么? 我正在寻找基于 .net 的解决方案。

【问题讨论】:

  • 我会选择选项 1。为什么?在做出选择时,您会考虑很多因素。也许它并不重要,但你可以将 Web 服务器推到其他组件中的负载越多,你的 Web 服务器响应请求的速度就越快。
  • @Mick 谢谢。我在您的回复后详细说明了我的问题。请看一看。

标签: asp.net .net architecture


【解决方案1】:

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

  1. 可扩展性 - 由您决定在哪里部署服务。它可以与 Web 应用程序共享同一台服务器,或者如果您发现负载增加,您可以轻松地将其移动到另一台服务器上。
  2. 稳健性 - 如果 Web 应用程序或服务中存在严重错误,则不会导致其他组件崩溃。
  3. 维护 - 是的,有一点点开销,因为您必须调整部署过程,但这就像从输出文件夹复制所有二进制文件一样简单,您只需执行一次。另一方面,如果您只需要修复服务中的一个小错误,您就不必重新部署应用程序,从而将其关闭一段时间。

虽然我建议您使用第一个选项,但我不喜欢计时器的想法。有一个更简单和强大的解决方案。我将使用 MSMQ 绑定实现 WCF 服务,因为它为您提供了许多开箱即用的好功能:

  1. 您不必实现轮询逻辑。启动时,服务将连接到队列并等待新消息。
  2. 您可以轻松地使用事务处理队列消息。例如,如果数据库出现问题并且您无法向其写入,则当前正在处理的消息不会丢失。这将返回队列以供稍后处理。
  3. 您可以部署尽可能多的服务来侦听同一个队列,以确保可伸缩性和可用性。 WCF 将确保同一队列消息不会被多个服务处理,也就是说,如果服务 A 正在处理一条消息,服务 B 将跳过它并获取下一条可用消息。
  4. 您可以了解here 的许多其他功能。

我建议阅读this 文章以获取 WCF + MSMQ 服务示例,看看实现一个和使用我上面提到的功能是多么简单。完成 WCF 服务后,您可以easily host it in a windows service

希望对你有帮助!

【讨论】:

  • 对迟到的评论表示歉意。感谢 Maksym 的出色回复。关于您对 MSMQ 的引用,我必须改为从 IBM Websphere MQ 读取消息。
  • 没问题。建议的解决方案只是一个旁注,如何实现它取决于您,但是在 Windows 服务和 Web 应用程序后台任务之间进行选择时,我很确定您应该使用 Windows 服务,除非有一些重要的事情您没有在问题中提及
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多