Jeff 之前曾在博客上写过使用缓存在他的网站上执行“带外”处理,但是我想知道人们使用哪些其他技术来处理这些类型的任务?
9 回答
多年前,我看到 Rob Howard 描述了一种使用 HttpModule 在后台处理任务的方法。它看起来不像使用缓存那么流畅,但在某些情况下可能会更好。
这篇博文有详细信息,如果你环顾四周,还有许多其他的可以捕获相同的信息。
视窗服务
您可能想看看DotNetNuke是如何做到的。我知道它是用 VB.NET 编写的,但我将代码改造成 C#。我正在仔细阅读源代码,并注意到他们在管理区域中有一个功能来设置计划任务。这些任务通过管理界面进行设置并存储在数据库中。当站点启动时,通过 Global.asax 文件,他们要么创建另一个线程来运行此服务,然后在其预定时间运行预定任务。我不记得确切的逻辑,已经有一段时间了,但它绝对是其他人如何为 Asp.Net 应用程序完成带外进程的一个很好的资源。这种技术仍然保留了 Asp.Net 应用程序中的逻辑,但在我看来它超出了范围。
如果它主要是数据处理任务并且您使用的是 MSSQL,那么计划的 SSIS 任务怎么样?
计划任务或 cron 作业。
计划任务或 cron 作业的问题在于它们不与 Web 服务器共享内存空间。您可以设置一个从 Web 服务器请求页面的计划任务,但这可能会给长时间运行的任务带来问题。如果在实际的 ASP.Net 应用程序堆栈上运行一些低优先级线程来执行简单的实用任务,例如清理缓存、监视资源以及处理一般的内务管理,那就太好了。
简单的队列文件以及单独的代理。对于每种类型的带外进程,编写一个单独的代理 .exe,它会监视队列文件的目录,其中包括执行指定进程所需的任何数据。
这可能看起来很脏,但在现实世界中,我发现它提供了很大的灵活性,您不会在 ASP.net 进程空间中进行大量处理,并且您可以轻松地将这种样式用于将处理农场处理到运行当您开始需要更多 RAM/CPU/磁盘时,Mono 上的代理进程。
如果您对 asp.net 页面最满意,您可以编写一个小应用程序来处理您的工作,然后使用监视您网站的外部服务“ping”该应用程序。这将使应用程序保持活力。