【问题标题】:Types of services for long running asp.net processes长时间运行的 asp.net 进程的服务类型
【发布时间】:2014-10-07 19:16:04
【问题描述】:

我们的网站有一个长期运行的计算过程,让客户等待几分钟,直到完成。我们已经决定我们需要进行设计更改,并将处理外包给 Windows 或 WCF 服务,而在我们进行所有计算时,客户端会看到另一个页面。

但是,实现该服务的最佳方式是什么?

我们查看了后台工作进程,但看起来这些是有问题的,因为如果 IIS 可以定期关闭线程

似乎最好使用 Windows 服务或 WCF 服务。有没有人对此有更好的看法? 如果我们将服务托管在另一台机器上,它是否必须是 WCF 服务? 看起来很难让服务(无论它是什么类型)与网站进行通信 - 也许服务可以将其结果更新到数据库中,然后网站会轮询该数据库以获得所需的结果。

我知道这是一个开放式问题,但有人有什么想法吗?

谢谢

【问题讨论】:

  • hangfire.io 看起来很有希望——它本质上是一个轻量级的消息队列。我不确定您在 Windows 服务和 WCF 服务之间的区别。 Windows 服务可以承载 WCF 服务。或者,Windows 服务可以临时托管您想要的任何内容。

标签: asp.net wcf


【解决方案1】:

我认为性能方面的真正收益不会来自设计更改。

如果我要在 Windows 服务和 WCF 之间进行选择,我会选择 Windows 服务,因为我可以根据需要修复关联和优先级。但是,我必须实现同时为多个客户端提供服务的逻辑(在 WCF 服务方法中,这将由 IIS 处理)。

所以就性能而言,如果您对 WCF 服务和 Windows 服务都使用 .NET 框架,则性能差异不会很大。 Windows 服务会更“可控”,WCF 会更直接,不会有很大的性能损失。

对于这些类型的任务,我会专注于高度优化单线程计算。如果您有一个复杂的计算,可以用本机代码(C 或 C++)编写吗?您可以制作一个高度优化的 .DLL 文件,供 Windows 服务或 WCF 服务使用。使用这种方法将允许您选择最佳编译器选项并充分利用您的机器资源。也没有什么能阻止您在 .DLL 函数中创建多个线程。

在两种情况下都可以确保网站和服务之间的链接:通过 Windows 服务的套接字(用于创建协议的额外代码)或直接通过 WCF 的 SOAP。如果您将结果推送到数据库中,困难在于让网站(并且知道特定的用户会话)知道数据在那里。

这就是我会做的。

希望对你有帮助。

干杯!

【讨论】:

  • 谢谢你 - 计算并不难,但它们也涉及调用外部 Web 服务,这就是为什么我认为 WCF 可能是要走的路(纯 Windows 服务可以轻松调用外部网络服务?)
  • 纯原生windows服务可以调用外部web服务,但是需要生成相应的代码来实现通信协议。我认为这种努力不会在性能方面得到回报。 WCF 可能是最好的解决方案。
  • 另外,您的问题似乎是 Web 服务的延迟,而不是计算线程没有获得足够优先级的事实。通常在这种情况下,具有改进的 I/O 功能的更好的硬件可以解决一些问题。另一种奇异而优雅的方法是使用 memcached 方法 (memcached.org)
【解决方案2】:

一种方法是:

  • 客户端使用调用 WCF 服务(可以托管在 IIS 中)提交计算请求
  • 计算请求存储在具有唯一 ID 的数据库中
  • ID 返回给客户端
  • Windows 服务(或多台不同机器上的多个服务)轮询数据库以获取新请求
  • Windows 服务执行计算并将结果存储到带有 ID 的结果表中
  • 客户端使用 ID 轮询结果表(使用 WCF 服务)
  • 计算完成后返回给客户端

【讨论】:

  • 嗨设拉子 - 好电话,这大致就是我们决定做的事情。我不确定我是否明确说明了计算 - 以及处理内容,它们还涉及调用外部网络服务 - 所以我们希望我们的客户在所有这些网络服务调用和计算都在流失的同时继续使用该网站,但是我同意网站更容易轮询数据库以查看计算是否完成,因为“回调”到网站非常困难。感谢您迄今为止的帮助!
猜你喜欢
  • 2015-02-14
  • 2011-01-22
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多