我们有一个 ASP MVC 3.0 应用程序,它使用实体框架(全部在 Azure 上)从数据库中读取数据。我们有几个长时间运行的查询(已完成优化),我们希望确保该解决方案具有可扩展性并防止线程饥饿。
我们查看了异步控制器并使用 I/O 完成端口来运行查询(使用 BeginExecute 而不是通常的 EF)。然而,异步很难调试并且增加了代码的复杂性。
建议的解决方案如下:
Web 服务器(Web 角色)获取涉及长时间运行查询的请求(例如客户细分)
它将请求信息连同相关参数一起输入到表中并返回,从而允许线程处理其他请求。
我们在 db 中设置了一个标志,使 UI 能够在页面刷新完成时声明查询正在进行中。
工作人员角色不断查询此表,并在找到此条目后立即处理长时间运行的查询(客户细分)并使用结果更新原始客户表。
在这种情况下,不需要立即将状态返回给用户。用户可以在几分钟内回来查看他们的请求是否已得到处理。而不是我们计划使用 Azure 队列的表(但我猜 Azure 队列无法通知工作人员角色,因此 db 表就可以了)。这是一个可行的解决方案。这样做有什么陷阱吗?