最具可扩展性的解决方案是您排除的解决方案——一个没有共享状态的单层 Web 应用程序,它可以拥有任意数量的节点。没有什么比负载均衡器后面的n 个Web 服务器和m个分布式数据库节点更具可扩展性了。由于您已经排除了最具可扩展性的架构,因此您问错了问题,因为您可能不追求可扩展性。也许您正在研究其他一些架构原则,例如可用性。
为什么我们要在多个服务中分离出功能?有很多原因。异步处理允许更好的可用性(通过写入队列而不关心故障)。它还允许我们管理瓶颈,例如数据库。我们还将我们的应用程序分解为服务,以简化开发和部署。因此,它可能是可用性、可维护性、安全性、性能、可部署性、成本、可用性、可测试性、合规性或您正在寻找的其他东西。在抓住可扩展性锤之前,您需要自己回答这个问题。我专门写了CALM来帮助提出和回答这些难题。
回到你的问题的细节。在 Windows Azure 上通常可扩展(如果这是您真正需要的话)的事实上的异步处理模式中没有 WCF。WCF 有特定的原因吗?它最好是一个好的,因为如果不需要,WCF 和服务总线会引入不必要的复杂性。在 Windows Azure 上,我们使用 Web 角色(托管 MVC 应用程序)实现异步处理,将消息放在 Windows Azure 队列上,这些由工作角色处理。如果您需要客户端(浏览器)了解结果,您可以手动滚动 CQRS 模式,或使用 SignalR,正如其他人提到的那样。我会认真考虑取出 WCF。
就您的场景而言:
场景 0:
无状态 Web 服务器完成所有处理并直接与分布式数据库节点通信。这是最具可扩展性的,但还有其他缺点。
场景 4:
前端将消息放入 Azure 队列并将结果返回给客户端。Worker 角色处理消息并将结果放在某处(表存储或 blob)。浏览器 Javascript 轮询结果数据并在“完成”时将其呈现给客户端。这是CQRS-ish。(邓瑞的回答)
场景 5:
前端将消息放入 Azure 队列并将结果返回给客户端。Worker 角色处理消息并通过 SignalR 将结果发送给客户端。(jgauffin的回答)
我更喜欢场景5