【问题标题】:.NET webservice - acknowledge quickly, but continue processing in background.NET webservice - 快速确认,但在后台继续处理
【发布时间】:2010-03-01 15:36:53
【问题描述】:

我正在构建一个将由供应商的应用程序使用的 .NET Web 服务,但我不确定如何完成以下操作:

  • 供应商将致电我的网络服务提供一些信息,但希望快速返回确认,仅说明我收到了他们的信息。他们不在乎我用它做什么,也不想承认我已经完成了处理。
  • 传递给我的信息需要在幕后做一些事情,并以对时间敏感的方式对信息采取行动 - 即在几分钟内采取一些行动。我将联系一些其他的网络服务,以及做一些数据库工作。显然,这将是在我向调用应用程序响应“成功”之后。

我无法控制供应商访问我的服务的方式,并且他们用来调用它的方法是同步的,因此我需要快速响应以让调用应用程序继续其工作。在我看来,有两种选择,尽管我对其他人持开放态度:

  1. 由于调用应用程序本质上是提交到队列以便我编写的进程可以处理它,我可以让 Web 服务将项目提交到数据库(或 MSMQ 或其他队列)然后返回成功.队列进程将从那里开始处理。
  2. 理想情况下,我认为我的服务可以返回“成功”,然后继续自行处理,但我不确定这是否可能。由于我的处理对时间敏感,因此启动新请求的后端处理是理想的,因此等待时间最短。

还有其他想法吗,或者其中一个听起来更可取?

【问题讨论】:

    标签: .net asynchronous web-services queue


    【解决方案1】:

    我认为第一个是唯一可能的解决方案。第二是非常糟糕的设计。假设您处理每个请求 1 秒,平均 1 秒内有 2 个请求。你会很快耗尽资源(因为会使用越来越多的线程)

    第一个很好,因为您可以控制如何存储和处理请求。好的设计是将 Web 服务作为前端,它只会回答“成功”并将请求排入队列。作为持久存储,我推荐 MSMQ 或数据库。然后创建一个服务应用程序,该应用程序将具有线程池并从队列(db)中选择。

    【讨论】:

    • +1 - 第一个选项是容错的,更具可扩展性,并且在初始投资后更易于维护和扩展,从而在您的应用程序之间提供更好的关注点分离。如果这些事情不重要,或者不如让您的服务快速启动和运行那么重要,我只会考虑选项二。
    • 有趣的想法——直到我发帖说我基本上只是在滚动自己的队列时才想到。有没有办法让我向某处运行的 Windows 服务发送命中,让它知道新的队列项,因为我会将它存储在数据库中,或者我是否需要等待服务检查队列本身看看新项目?
    • @rwmnau - 我只是配置服务来检查队列本身。如果您使用的是 .NET System.Messaging API,则可以在循环中执行 MessageQueue.Receive,并设置合理的超时时间。超时时,检查服务是否正在关闭。如果是则中断循环,否则返回接收消息。该过程将在消息写入目标队列后立即提取它们。 (除了在它检查是否应该关闭的短暂时间内。)
    • 您可以让您的生活更轻松 - 您可以将 WCF 与 MSMQ 绑定一起使用,而无需编写任何代码来处理 MSQM。
    【解决方案2】:
    1. 接收请求
    2. 使用传入的参数分离后台进程(例如,使用 BackgroundWorker)
    3. 返回确认 - 带有 Guid 或类似的请求标识符
    4. 进行处理...
      1. 同时,调用者可以 ping 您的服务以根据标识符更新状态
      2. 在处理过程中,返回“仍在工作”响应,或者,如果您很聪明或可以准确预测,则返回进度度量(可能是完成的百分比或剩余时间)
    5. 处理完成后,向状态请求返回“成功”消息
    6. 通过您之前回复的标识符使解决方案可用

    【讨论】:

      【解决方案3】:

      选项 1 是可行的方法,因为应用程序已经支持排队。

      至于选项 2 - 您可以从您的 Web 服务启动一个工作线程,这将处理工作,您可以继续从主线程返回“成功”。

      【讨论】:

        猜你喜欢
        • 2013-01-30
        • 2015-01-19
        • 1970-01-01
        • 2019-10-17
        • 2014-08-29
        • 2011-11-16
        • 2016-04-02
        • 2020-11-20
        相关资源
        最近更新 更多