Asp.Net - 将处理卸载到外部应用程序
Posted
技术标签:
【中文标题】Asp.Net - 将处理卸载到外部应用程序【英文标题】:Asp.Net - Offload processing to external application 【发布时间】:2013-01-09 19:57:10 【问题描述】:我有一个使用 3rd 方 exe 处理请求的 asp.net 网站。目前我的工作流程是
用户使用任何浏览器访问网站并填写一份包含工作详细信息的表格
网站调用 WCF 自托管 Windows 服务,该服务正在侦听端口
Windows 服务启动 3rd 方 exe 来处理作业并将结果返回到网站
网站将返回的结果展示给用户
上述网站是一个原型,现在需要转变为可用于生产的部署。我意识到上述架构有很多可能会破坏的点。例如,如果机器关机或者windows服务崩溃并且不再监听端口,所有当前请求将停止处理。为了使架构更加健壮,我正在考虑以下
用户使用任何浏览器访问网站并填写一份包含工作详细信息的表格
网站将工作详细信息写入数据库
每 10 秒轮询一次数据库以获取新作业的 Windows 服务会选择该作业并使用第 3 方应用程序执行它。结果被写回数据库。
现在已经开始轮询数据库、获取结果并将其显示给用户的网站。
第二种架构为我提供了更多的日志记录功能,并且如果它们在队列中,它们可以重新开始。然而,它涉及大量可能不可扩展的轮询。谁能推荐一个更好的架构?
【问题讨论】:
我们为类似的需求做过 POC,我们在第 2 步考虑了 MSMQ,但没有在项目中实现。期待这个有趣的实现的答案.. @Sundeep - 您最终为您的项目使用了 MSMQ 的替代品吗?项目已完成还是仍在进行中?谢谢 很久以前,应用程序做一些后端处理并向用户发送通知电子邮件。所以,想替换它以进行即时处理。 如果你真的希望它健壮,那么你应该直接使用 MSMQ,或者使用依赖于 MSMQ 的 WCF 绑定之一。不要重新发明***,尤其是重要的时候。 我已经使用了 MQSeries(但 MSMQ 是相同的原理)和“保存到数据库”......两者都是有效的选项 - 但是:既然您已经拥有并了解 WCF,请查看“ netmsmqbinding',它允许您使用 WCF 写入 MSMQ(和读取)。 msdn.microsoft.com/en-us/library/… 【参考方案1】:我会选择 MSMQ 或 RabbitMQ,而不是轮询。
这样您就可以将处理工作分流给队列的多个消费者(可能是与 Web 服务器分开的服务器),并并行处理更多请求。
【讨论】:
这似乎是目前最好的选择。其他人也建议使用 MSMQ,但我只能接受一个答案。我会接受这个作为答案,因为它有充分的理由选择这种方法而不是轮询。【参考方案2】:我在我的一个应用程序中实现了相同的架构,其中用户发出多个请求来处理。所以我有 -
-
用户进入网站,选择参数等提交请求
请求与所有详细信息 + 用户名等一起存储到数据库表中
服务查看数据库表并以先进先出的方式提取请求
处理完请求后,根据 requestId 将状态更新为 Failed 或 Completed 到数据库表中,网站上的用户可以看到
如果有任何请求,服务将接收下一个请求,否则停止。
服务每 30 分钟运行一次
【讨论】:
如果我有幸每 30 分钟接收一次请求,我会采用这种方法。但是,对于我当前的应用程序,响应需要是实时的,并且可能会产生大量请求(每小时 200 多个请求)。以上是关于Asp.Net - 将处理卸载到外部应用程序的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Web 应用程序在部署后不卸载 AppDomains
如何防止外部文档文件被复制到 ASP.NET 应用程序中的 bin 文件夹
ASP.NET:将外部变量传递到 <asp:sqldatasource> 标记 ASP.NET 2.0