我们系统的几个组件具有“长期运行”的操作。它们可能需要几秒钟到几分钟的时间,并且它们的 CPU 使用率会有所不同。例如,报告生成将占用 CPU 几秒钟,但数据收集主要用于等待数据库查询。
我面临两个选择:
(1)Web角色+工作者角色+队列+表。Worker 角色在队列上旋转,获取带有参数的消息,执行工作,使用进度和完成标志更新表。客户端旋转,显示进度,直到标记完成。一个 Web 角色,根据需要扩大工作人员角色的数量。
(2) Web角色+异步方法。让我的长时间运行的操作使用 .NET 4.5 的 async/await 内容,并将控制器操作标记为异步。根据需要扩大 Web 角色的数量。
选项 1 显然要复杂得多,但它的优点是可以让网络角色自由地做网络事情,并在事情开始变得非常繁忙时允许适当的排队。选项 2 更简单,需要更少的角色和存储资源,但如果事情开始变得繁忙,它是否有可能阻塞整个网站?为了简单起见,我强烈倾向于选项 2。有什么特别的理由不这样做吗?如果网站开始变慢,简单地增加 Web 角色实例的数量就可以解决性能问题,对吗?