2012-03-22 52 views
0

我有一个昂贵的服务器端资源(这是线程安全的)。我想提供的是:编写基于.NET的REST服务 - 使用线程池和Singleton

  • 远程REST接口,而其他应用可以提交数据,并把它加工

从非功能性的角度来看:

  • 我想贵服务器端对象为Singleton,即单个实例将服务所有请求
  • 我想限制正在招待的请求的数量 - 如果有更多的请求,那么允许的池,休息应该wai t在队列中进行处理。

我可以编写自定义代码来完成上述说明,但我不想这样做。自从我使用WCF以来,我已经有一段时间了 - 任何人都可以指导我设计架构?

问候。

供参考:由于许可限制,我真的不能创建多个对象实例。

回答

1

为什么不使用Object Pool模式来控制昂贵的服务器端对象的生命周期?

Singleton对请求数量施加限制听起来有风险。迟早它会报复你,因为客户的数量会增加,你的服务将是低效的。另外,Singleton在并发环境中是有风险的,如果Singleton有它自己的状态,两个或多个并发请求将会破坏它。

另一方面,您将完全控制游泳池,创建多少昂贵的对象以及何时创建。是的,你需要一个自定义代码。

如果您仍然需要开箱即用,您可以使用ServiceBehavior属性来控制您的服务。 InstanceContextModeConcurrencyMode属性可能会按照您的预期工作 - 允许您设置单例模式并对传入请求进行排队(InstanceContextMode.SingleConcurrencyMode.Single)。

+0

谢谢,但我有以下限制:a)由于许可+技术限制,我实际上无法创建多于一个实例; b)单身物体没有任何状态。 – effkay 2012-03-22 09:05:32

+0

然后你可以按照'ServiceBehavior'建议。 – 2012-03-22 09:11:38

+0

问题:ConcurrencyMode.Single在任何给定的时间只会让一个请求被娱乐 - 有没有一种方法可以指定一个池大小?比如说,最多10个电话应该在任何给定的时间进行娱乐?是否可能在代码级别或我需要配置IIS? – effkay 2012-03-22 09:46:41