多线程Singleton WCF服务

时间:2011-06-15 13:28:24

标签: wcf

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

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

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
   ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FooService : IFoo
{
}

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

3 个答案:

答案 0 :(得分:7)

您的假设可能适用于为没有SSL的basicHttpBinding配置的WCF服务(请参阅here for more info),但对于其他绑定则不太可能。尽管您的应用程序代码可能确实是无状态和/或线程安全的,但WCF使用sessions internally在其他绑定中支持功能。这意味着每个请求只能处理一个会话,因为只有一个服务实例。

似乎选择单例模式是一个过早优化的案例。只有在有需要的情况下才能优化GC效率。

答案 1 :(得分:6)

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

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

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

Check out this MSDN article有关diff的更多讨论和实际性能比较。模式。

答案 2 :(得分:2)

你想要避免单身的原因之一是因为通常你有一个共享资源,你必须使线程安全。一旦这样做,您就有可能在串行队列中堆叠服务调用,因为一次只允许在该关键部分进行一次调用。

由于你有一个无状态的单身人士,这可能不是问题。但是,它会让以后容易发生这种事情。