我有一个 .NET 函数可以执行一些复杂的计算。根据传入的参数,该函数:
- 运行时间从几分钟到几个小时不等
- 计算期间使用 100% 的单核
- 需要 100 MB 到几 GB 内存
- 将几 MB 到几 GB 的数据写入磁盘
- 可能会引发异常,包括 OutOfMemoryException
可以通过函数参数化准确预测要写入磁盘的数据量。没有简单的方法可以从函数参数化中预测其他资源需求。
我需要通过网络服务公开此功能。该服务需要:
- 有弹性并优雅地报告计算过程中的任何问题
- 能够处理并发请求,前提是有足够的资源来处理请求而不显着降低性能,否则会优雅地拒绝请求。
我打算通过让初始请求返回可以轮询进度的状态资源来处理长时间运行的性质。计算完成后,该资源将提供输出数据的位置,客户端可以下载该数据(可能通过 FTP)。
我不太清楚如何最好地处理其他要求。我正在考虑某种“计算池”,它维护计算器的实例并跟踪当前正在使用哪些实例,但我还没有弄清楚详细信息。
有没有遇到过类似情况的 friend 可以给点建议吗?只要解决方案可以在 Windows 机器上运行,所有技术选项都可以考虑。
最佳答案
我建议将您的申请分为两部分。
- 网络服务本身。它的功能:
- 从客户处获取工作项;
- 将此工作转移到执行实际工作的后端服务;
- 报告进度和结果;
- 后端服务。它的功能:
- 处理来自网络服务的请求;
- 执行实际计算。
这样设计的原因是
1)处理托管应用程序(ASP.NET)中的工作负载相对困难,因为服务器(IIS)将管理资源,而在单独的应用程序中您有更直接的控制;
2)两层设计更具可扩展性 - 例如,以后您可以轻松地将后端移动到另一台物理机器(或多台机器)。
Web 服务应该是无状态的 - 例如,在接受请求后,用户会返回一些 ID 并使用此 ID 轮询服务以获取结果。
后端服务器可能必须维护一个要处理的请求队列以及一组处理它们的工作线程。工作人员应监视可用资源并注意不要使机器过载(当然,还要妥善处理所有可能的错误情况)。
关于.net - 设计长期运行、资源密集型 Web 服务的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163344/