基本上,从Juval Lowy购买的“WCF Master Class”中学习,每次调用激活是需要扩展的服务的首选选项,即需要处理大量并发请求的服务。
为什么?
通过每次调用,每个传入请求(达到可配置的限制)都会获得自己的,新鲜的,孤立的服务类实例来处理请求。实例化一个服务类(一个普通的旧.NET类)并不是一个很大的开销 - 并且WCF运行时可以轻松地管理10,20,50个并发运行的服务实例(如果您的服务器硬件可以处理它的话)。由于每个请求都有自己的服务实例,因此该实例一次只能处理一个线程 - 并且编程和维护都非常容易,不需要繁琐的锁和其他线程安全所需的东西。
使用单独服务(InstanceContextMode=Single
)可以是一个可怕的瓶颈(如果你有ConcurrencyMode=Single
- 那么每个请求被序列化,处理一个又一个的),或者如果你想不俗的表现,你需要ConcurrencyMode=Multiple
,但是这意味着你有处理多个并发线程的服务类的一个实例 - 在这种情况下,作为该服务类的程序员,您必须确保所有代码,对变量等的所有访问都是100%线程安全的 - 这就是的确是一项任务!只有极少数的程序员真的掌握了这种黑色艺术。
在我看来,在每个调用场景中创建服务类实例的开销与为多线程单例WCF服务类创建完全线程安全的实现的要求相比没有任何意义。
因此,在你与中央队列具体的例子,我想:
所以,我要说的是:尽量将服务调用(即提供数据)与建立队列分开,并执行大量且处理密集型计算 - 将职责分开:WCF服务应只接收数据并将p将它放入队列或数据库中,然后完成它 - 另一个单独的过程应该处理/繁重。这使您的WCF服务精益'n'mean
你将需要一个单例来实现队列,然后prolly'懒惰'。 –
DarthVader