实例管理1(单调服务)

     实例管理是指WCF中对服务的实例管理方式,通过它可以将客户端请求绑定到服务实例上,并根据请求的类型来确定服务的实例管理方式。

     WCF支持三种实例激活的类型:

单调服务(PerCall Service):每次的客户端请求分配一个新的服务实例。

会话服务(PerSession Service):每次客户端连接分配一个服务实例。

单例服务(Singleton Service):所有的客户端会为所有的连接和激活对象共享一个相同的服务实例。

      简单说一下单调服务。

      如果服务类型被配置为单调模式,那么服务实例(CLR对象)只会存在于客户端调用过程中。每次的客户端请求(WCF服务方法调用)都会获得一个新建的专门的服务实例。如果服务实现了IDisposable接口,WCF会自动调用Dispose()方法,允许服务执行所有必要的清楚工作。调用Dispose()方法的线程与分发原有方法调用的线程是相同的,同时Dispose()含包含了一个操作上下文。一旦调用了Dispose()方法,WCF就会断开实例与其他WCF基础架构的连接,然后将它放到垃圾回收器中等待回收。

     传统的C/S模式时,每个客户都有自己的服务器对象,而且不管客户使用对象的时间的长短,应用程序都会长时间占用对象,从而占用一些紧张的资源,直到资源消耗完毕。而在单调模式下,只为客户端分配一个对象,只有在并发调用时,才会维护多个实例对象。

     在调用期间,客户端仅仅持有一个代理的引用,而不是实际的对象。这样做的好处就是客户端在释放代理对象之前,服务就可以释放被服务实例长期占用的昂贵资源。同时,只有在客户端需要的时候,才会获取这些资源。

     即使服务端重复的创建和销毁服务实例,它与客户端的连接(通过客户端的代理)也不会断开。   

     如果每次调用都需要事务资源和事务编程,那么单调服务会强行要求服务实例重新分配或连接资源,从而减轻同步实例状态任务。单调服务有利于实现事务编程模型。

     它可以用于离线队列调用,因为它能够建立服务实例与离散队列消息之间的简单映射。

单调服务的状态

     使用单调服务进行方法调用时,客户端并不知道是否需要每次获取一个新的实例。因此单调服务必须是状态相关的,也就是说他必须管理自己的状态,并在持续的会话过程中给客户端一个提示。正式因为状态,特别是代价昂贵的状态,才需要使用单调模式。单调服务的一个服务实例创建于每个方法调用之前,调用完成后会立即销毁该服务实例。因此在每次调用之初,对象需要获取存储在某处的值来初始化它的状态。一般的存储体是数据库或者文件系统,也可以是静态变量。

     由于单调服务会从每次方法调用中的存储体获取状态,只要存储的是所有机器都能够访问的全局资源,那么单调服务完全适用于负载均衡的系统环境。

     单调服务会为每次方法调用重建实例状态,这必然会影响系统的性能。但换来的却是良好的可伸缩性,因为它持有了服务所依赖的状态与资源。

      单调服务的选择

      对于WCF而言,单调服务是最佳的实例管理模式。

      单调服务有利于系统的可伸缩性。服务设计有一个黄金法则是10X,即设计出的每个服务应该能够处理至少多于需求一个量级以上的负载。

      单调服务有利于实现事务编程模型,而不用考虑系统的负载。

原文地址:https://www.cnblogs.com/jyz/p/1306376.html