多线程Singleton WCF服务

Oli*_*old 9 wcf

在他的"编程WCF服务"一书中,Juval Lowry表达了对使用Singleton Services的担忧,因为它具有性能影响.

在我的一个项目中,我正在使用像这样声明的无状态单例WCF服务:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
   ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FooService : IFoo
{
}
Run Code Online (Sandbox Code Playgroud)

通过httpsTransport从多个Silverlight客户端访问该服务.我选择了单例,因为我认为没有必要在不需要时为系统增加GC开销.我是否遗漏了某些内容,或者这不应该是实现无状态服务的最有效方式,如果不比PerCall实例化服务更快,它同样快速?

Six*_*aez 7

您的假设可能适用于为没有SSL的basicHttpBinding配置的WCF服务(有关详细信息,请参阅此处),但其他绑定不太可能.尽管您的应用程序代码可能确实是无状态和/或线程安全的,但WCF 在内部使用会话以在其他绑定中支持功能.这意味着每个请求只能处理一个会话,因为只有一个服务实例.

似乎选择单例模式是一种过早优化的情况.只有在经过验证的需求时,才能优化GC效率.

  • @Oliver,我打电话反对这些建议(我认为是使用percall模型进行无状态服务以获得最佳吞吐量),以避免一些你不知道的事情会成为一个早期的问题:) (2认同)

Dre*_*rsh 6

你没有遗漏任何东西.如果您的服务类没有实例成员变量,这些变量代表的状态显然可能被多线程访问损坏,那么没有什么可担心的.

我个人总是使用Single + Mulitple模式,因为我的所有状态总是来自缓存或SQL数据库或其他一些共享资源,你需要模式来防止并发.我从未发现我的服务中需要成员变量.静?当然也许,但是你知道无论如何要保护他们.

现在这是我对PerCall vs. Single的个人看法.另一方面,PerSession服务可能/很可能在实例中维护状态,但我个人并没有发现自己编写了很多这些服务,并且在极少数情况下,它们仍然是ConcurrencyMode.Single.

查看此MSDN文章,了解有关diff的更多讨论和实际性能比较.模式.