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 文件夹

使用外部 JWT 令牌 ASP.NET CORE

ASP.NET:将外部变量传递到 <asp:sqldatasource> 标记 ASP.NET 2.0

带有外部缓存提供程序的 ASP.NET MVC OutputCacheAttribute

在弹出窗口中使用 Owin 外部登录的 Asp.net 登录提供程序