问题描述
|
我有一些使用WCF 3.5 + RESTful入门套件开发的WCF RESTful服务。我遇到了许多同样的抱怨,它们表现不佳并且不能很好地处理大量请求。我认为部分原因是3.5中的RESTful功能更多是社区附加组件。
既然WCF 4.0 RESTful服务已经推出了一段时间,我想有些人已经使用它进行开发并在生产环境中使用它。
我当时在看使用WCF REST服务模板40(CS),并且看是否有人有任何性能/可伸缩性问题。我还检查了WCF 3.5和WCF 4.0的RESTful服务之间是否对性能/可伸缩性进行了比较。快速进行Google搜索不会产生很多结果。
任何反馈将不胜感激。
编辑
每个请求在这里是我的配置:
<bindings>
<webHttpBinding>
<binding name=\"TransportWeb\">
<security mode=\"Transport\">
<transport clientCredentialType=\"None\"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service behaviorConfiguration=\"SecureBehavior\" name=\"Service\">
<endpoint address=\"\" binding=\"webHttpBinding\" bindingConfiguration=\"TransportWeb\" behaviorConfiguration=\"REST\" contract=\"IServce\"/>
<endpoint address=\"mex\" binding=\"mexHttpsBinding\" contract=\"IMetadataExchange\"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name=\"SecureBehavior\">
<serviceMetadata httpGetEnabled=\"false\" httpsGetEnabled=\"true\"/>
<serviceDebug includeExceptionDetailInFaults=\"true\"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name=\"REST\">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
解决方法
在我们指责您所建立的框架技术之前,请向我们详细介绍您的特定实现。我个人发现,只要适当利用WCF,它的每个方面都可以扩展到令人难以置信的程度。很多时候,您会发现应该归咎于具体的实现/配置。
因此,这里有一些有关您的实施的问题,希望可以帮助社区更好地帮助您:
您要提出什么样的要求?
您正在使用入门工具包的哪些功能?
绑定如何配置?
您是否在流式传输任何二进制数据?
您在使用任何安全性吗? (SSL,用户/密码等)
您是否正在针对任何请求执行任何长期运行的任务?
更新1
因此,从绑定的角度看一切都很好,从您的解释来看,这听起来像您在这里拥有了一个漂亮的“香草” WCF服务。不过,听起来似乎您并没有使用任何WCF 3.5 REST Starter Kit框架,所以我不确定您是否遗漏了一些细节或是否被误认为了说你用它。
我注意到您在服务配置中没有做的一件事是设置了任何显式的“ 1”值。默认情况下,.NET 3.5中的最大并发调用数仅为16。因此,取决于调用的持续时间以及客户端在任何给定时间点的饱和度,您可能会被阻止。如果您查看此MSDN标题为“优化WCF Web服务性能”的部分,您将看到一些指导,建议将ѭ2实际配置为每个内核16。那就是.NET 4与众不同的地方,因为如果您不指定自己的显式值,它们实际上会自动为您处理16 *个内核。自然地,找到适合您应用程序的最佳途径的唯一方法是通过负载测试并使用数字。
综上所述,从您提供的信息中我看不出有什么错。如果您向我们介绍有关Web服务内部的更多信息,也许我们可以就如何实现更好的性能提出一些更好的建议。就目前我们所知,您的瓶颈可能在于与您进行交互的某个数据库。
因此,请回答这个问题的标题:在这一点上,我认为没有任何阻碍您前进的因素,因为您使用的是3.5。在4.0中肯定有一些性能上的改进,但是您在这里并不是在进行大规模的讨论,而是像我说的那样,您实际上并没有进行任何复杂的WCF定制或根据您的描述进行任何事情。
, 有关此问题的原因和解决方案的更多信息,请参见http://blogs.msdn.com/b/endpoint/archive/2011/05/04/wcf-scales-up-slowly-with-bursts-of-work.aspx。 。
根据您的评论,您确实有一个数据库调用。考虑到线程池的工作方式,您应该始终与需要高吞吐量的同步IO绑定操作区分开。