Wcf 哪种体系结构更具可扩展性

Wcf 哪种体系结构更具可扩展性,wcf,azure,scale,Wcf,Azure,Scale,我正在为Windowsazure云服务开发一个应用程序 应用程序的一般描述非常简单:MVC4上的前端、处理前端处理请求的中间层和SQLAzure/Blob后端 到目前为止,我还没有开始编写代码,在此之前,我希望获得一些反馈,了解以下哪种场景模型更具可伸缩性,以及可能的原因。如果你认为有我没有考虑过的第N个选项,请公开它 需要明确的是,单层应用是不可能的 场景1: 前端使用中间层上的WCF服务,该服务执行所有处理 场景2: 前端使用中间层上的WCF服务,该服务在SB上排队等待该请求。“Tier 3

我正在为Windowsazure云服务开发一个应用程序

应用程序的一般描述非常简单:MVC4上的前端、处理前端处理请求的中间层和SQLAzure/Blob后端

到目前为止,我还没有开始编写代码,在此之前,我希望获得一些反馈,了解以下哪种场景模型更具可伸缩性,以及可能的原因。如果你认为有我没有考虑过的第N个选项,请公开它

需要明确的是,单层应用是不可能的

场景1:
前端使用中间层上的WCF服务,该服务执行所有处理

场景2:
前端使用中间层上的WCF服务,该服务在SB上排队等待该请求。“Tier 3”使用消息并对其进行处理,还将应答排队等待WCF服务响应

场景3:
前端将消息排队,并循环等待响应消息。“Tier 3”使用消息,对其进行处理并重新排队,以便前端停止等待


基本上,所有的问题都归结为“WCF横向扩展的程度如何?”…

消息始终是最具可扩展性的解决方案,因为您可以配置任意数量的工作人员来使用和处理消息

但是,如果您仍然希望UI同步运行,那么切换到异步处理并不是件小事。您通常会切换到基于任务的UI,其中没有即时反馈给用户(或伪造反馈)


我在博客中介绍了如何使用查询、域事件和命令进行扩展:

消息始终是最具可扩展性的解决方案,因为您可以配置任意数量的工作人员来使用和处理消息

但是,如果您仍然希望UI同步运行,那么切换到异步处理并不是件小事。您通常会切换到基于任务的UI,其中没有即时反馈给用户(或伪造反馈)


我在博客中谈到了如何使用查询、域事件和命令进行扩展:

您没有说明前端需求是什么。这是一个需要回复数据的网站吗?通常,消息队列模式将更具可扩展性(但不会更快),因为这样您就有了许多处理请求的选项。然而,一旦你走上这条路,就很难在没有一些技巧的情况下向用户提供直接的同步反馈(这里可以选择信号器)


不管它值多少钱,我倾向于在云中使用CQRS模式,因为它可以很好地扩展以满足我的需要。我必须处理这样一个事实,即命令是异步处理的,用户没有得到同步响应。用户界面必须处理它。我们使用状态为的命令处理表。web(本例中是我们的客户机)必须轮询该表,以确定命令何时完成,以便知道何时尝试向客户机显示任何结果。对我们来说,这是一个值得权衡的问题,以获得我们所寻求的规模(以及CQR的其他好处)。

您没有说明前端要求是什么。这是一个需要回复数据的网站吗?通常,消息队列模式将更具可扩展性(但不会更快),因为这样您就有了许多处理请求的选项。然而,一旦你走上这条路,就很难在没有一些技巧的情况下向用户提供直接的同步反馈(这里可以选择信号器)


不管它值多少钱,我倾向于在云中使用CQRS模式,因为它可以很好地扩展以满足我的需要。我必须处理这样一个事实,即命令是异步处理的,用户没有得到同步响应。用户界面必须处理它。我们使用状态为的命令处理表。web(本例中是我们的客户机)必须轮询该表,以确定命令何时完成,以便知道何时尝试向客户机显示任何结果。对于我们来说,这是一个值得权衡的问题,以获得我们所寻求的规模(以及CQR的其他好处)。

最具可扩展性的解决方案是您排除的解决方案—一个没有共享状态的单层web应用程序,可以拥有任意多个节点。没有什么比负载平衡器后面的n个web服务器和m个分布式数据库节点更具可伸缩性了。因为您已经排除了最具可伸缩性的体系结构,所以您提出的问题是错误的,因为您可能并不追求可伸缩性。也许您正在研究其他一些体系结构原则,例如可用性

为什么我们要跨多个服务分离功能?原因有很多。异步处理允许更好的可用性(通过写入队列而不担心失败)。它还允许我们管理瓶颈,例如数据库。我们还将应用程序分解为多个服务,以便于开发、部署。因此,它可能是可用性、可维护性、安全性、性能、可部署性、成本、可用性、可测试性、法规遵从性,或者其他您需要的东西。在抓住可伸缩性锤子之前,你需要自己回答这个问题。我写这封信是为了帮助你提问和回答这些困难的问题

回到你问题的细节上来。事实上,在WindowsAzure上通常是可伸缩的异步处理模式(如果您真的需要的话)中没有WCF。是否存在WCF的具体原因?最好是好的,因为WCF和服务总线(如果不需要的话)会引入不必要的复杂性。在Windows Azure上,我们使用Web角色(承载MVC应用程序)实现异步处理,将消息放置在Windows Azure队列上,这些消息由工作者角色处理。如果您需要客户端(浏览器)了解结果,您可以手动滚动一个CQRS模式,或者使用Signal,正如其他人所提到的。我会的