如何扩展MVC 4 WebApi和Entity Framework

3
我有一个运用了MVC 4及WebApi技术的Web应用,后端涉及到实体框架。我使用StructureMap来将实体框架注入到WebApi中,并将WebApi客户端注入到MVC 4应用程序中。目前应用程序运行良好,但是很快我就需要进行扩容。MVC 4应用程序位于一台服务器上,WebAPI位于另一台服务器上,而数据库服务器则是在第三台服务器上。如何对WebAPI进行水平扩展?如果我添加WebApi服务器和数据库服务器,是否有一种可配置的实体框架,可以使用多个连接字符串并进行轮询查询?EF是否提供分片功能?Httpclient呢?像客户端采取多个IP地址以防单点故障,请求则转向另一个服务器。请问如何对它们进行扩容?
1个回答

3
通常情况下,人们会增加更多的Web服务器,然后使用负载均衡器来分配传入的请求。这里有几个要考虑的因素。
- 如果Web服务器通过ASP.NET会话在请求之间保留数据,则需要创建一个可共享所有Web服务器的单独状态服务器,或使用具有状态感知功能的负载均衡器。 - 如果性能问题源于数据库IO问题(缺少表索引、索引碎片化、请求返回大量结果集、硬件配置不佳等),则添加更多的Web服务器将无法解决该问题。第一步是监视和分析您的数据库,并确保其性能良好。

2
我已经知道这些了。HttpClint或者DbContext呢?它们能够使用多个连接字符串并进行一致性哈希和负载均衡吗? - DarthVader
1
不,你应该为所有的Web服务器保留一个单一的数据库。Microsoft对于SQL Server的建议总是先纵向扩展再横向扩展。横向扩展SQL Server非常困难,请参见http://msdn.microsoft.com/en-us/library/ms181131(v=sql.105).aspx获取更多信息。如果我需要横向扩展数据库,我不会使用Microsoft SQL。 - Eric Rini
单个数据库?这是个笑话吗?我曾在一家媒体公司工作,他们为了追踪而同步使用了30个SQL服务器。更别说处理每天数十亿次事务的单个服务器了,更何况是SQL服务器。 - DarthVader
如果您必须对Microsoft SQL进行水平扩展,您需要重新设计应用程序以考虑分布式分区视图,或者找到第三方应用程序来负载均衡集群。 - Eric Rini
AWS已经提供了这个功能,同样Azure也有解决方案。然而,对于一个有大量数据和访问者的应用程序来说,使用单一的集中式数据库是一个糟糕的想法。 - DarthVader
我无法理解为什么这个回答被接受,因为它非常模糊,每个人都知道我们需要负载均衡。真正的问题是,在 Web Api 中我们如何在技术上实现它,而不仅仅是理论上的讨论? - Syed Waqas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接