WCF编码规范(五):实例管理

1.     考虑系统的可伸缩性时,最好使用单调实例模式。

    说明:可伸缩性就是通过增加资源使服务容量产生线性(理想情况下)增长的能力。可伸缩应用程序的主要特点是:附加负载只需要增加资源,而不需要对应用程序本身进行大量修改。尽管原始性能对于确定应用程序所能支持的用户数很重要,但可伸缩性和性能是两个单独的实体。事实上,性能结果有时可能与可伸缩性结果是对立的。

    单调服务:会为每次的客户端的请求分配(销毁)一个新的服务实例。不会断开与客户端的连接,其本身具有缓存机制。

    单调服务会为每次方法的调用获取与保持实例的状态,这必然影响性能。但是每次的调用都持有服务所依赖的状态和资源。

 2.     如果契约设置为SessionMode.NoAllowed,则总是将服务实例配置为InstanceContextMode.PerCall。

说明:会话服务是每次客户端的连接分配一个服务实例。系统默认的设置是:SessionMode.Allowed,InstanceContextMode.PerSession.

    其设置:   

    [ServiceContract(SessionMode=SessionMode.NotAllowed)]

   Public interface ICalculator

   {}

   [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]

    public class Service:ICalculator

   {}

 3.     不要在相同的服务上混合使用会话契约与无会话契约。

说明:

[ServiceContract(SessionMode=SessionMode.Required)]

    interface ICalculator{}

   [ServiceContract(SessionMode=SessionMode.NotAllowed)]

   Interface IResult{}

 

    //避免

   Class Service:ICalculator,IResult

{}

 4.     避免使用单例服务,除非该服务本质上就是单例的。

说明:单例服务是所有的客户端共享同一个服务实例,必须同步访问它的状态以避免状态的冲突,这种约束会降低系统的吞吐量,影响性能。

单例服务同一时间内只能相应一个客户端请求。因此在系统的吞吐量、相应效率、系统服务性能上都存在严重的瓶颈

 

5.     要为会话服务使用有序递送。

    说明:当配置了“有序传递”的时候,客户端和服务端会开辟缓冲区,服务端缓冲区在接到所有客户端发来的消息后,按照客户端调用的顺序排序各个消息,然后有序地调用服务端

   [ServiceContract]

   [DeliveryRequirements(RequireOrderedDelivery= true)]

    public interface IReliable

   {

       [OperationContract(IsOneWay = true)]

       void Write(stringstr);

   }

 6.    避免为会话服务停止实例。

    说明:

    [ServiceContract(SessionMode=SessionMode.Required)]

   Interface IOrderManager

   {

       [OperationContract(IsInitiating=true,IsTerminating=false)]

       Void StartSession()

       [OperationContract(IsInitiating=false,IsTerminating=false)]

       Void OperationSession()

       [OperationContract IsInitiating=true,IsTerminating=true]

       Void  EndSession()

   }

 

    禁止设置:

    [OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.AfterCall)]

这样设置之后会对实例释放,导致变量恢复到初始状态。

 7.     避免使用分步操作

    说明:

    [ServiceContract(SessionMode=SessionMode.Required)]

   Interface IOrderManager

   {

       [OperationContract]

       Void StartSession()

       [OperationContract]

       Void OperationSession()

       [OperationContract]

       Void EndSession()

   }

    其调用是需要顺序的。可以采用强制措施执行。

   [ServiceContract(SessionMode=SessionMode.Required)]

   Interface IOrderManager

   {

       [OperationContract(IsInitiating=true,IsTerminating=false)]

       Void StartSession()

       [OperationContract(IsInitiating=false,IsTerminating=false)]

       Void OperationSession()

       [OperationContract IsInitiating=true,IsTerminating=true]

       Void  EndSession()

   }

 

8.     对于持久服务,总是指定完成操作。

    说明:持久服务主要指长期运行的业务流或工作流,包含多个执行序列,持续几天或几周。这期间客户端可以断开。

    持久服务初始化:其首先将其状态写入到持久存储器中,以便后续操作能够在存储器中找到该状态。持久服务终止:服务将状态从存储器中移除。否则随着时间的推移,存储器就会因为这些不需要的状态,而变的异常臃肿。

    例如:

   [Serializable]

   [DurableServiceBehavior]

    public class TextComposer : ITextComposer

   {

       private stringCurrentText;

       [DurableOperationBehavior(CanCreateInstance = true)]

       public stringPowerOn(string text)

       { CurrentText = text; returnCurrentText; }

       [DurableOperationBehavior()]

       public stringInsertText(string text)

       { CurrentText += " " +text; return CurrentText; }

       [DurableOperationBehavior()]

       public stringDeleteText(string text)

       {

           CurrentText = CurrentText.Replace(text, "");

           returnCurrentText;

       }

       [DurableOperationBehavior(CompletesInstance = true)]

       public voidPowerOff()

       {

       }

   }

 

    SessionMode和绑定有很大关系,如果绑定不支持会话,SessionMode设置为会话也会无效的。SessionMode.Required指的是需要传输层会话,即绑定是支持会话的。

绑定

会话模式

上下文模式

异步调用Dispose

实例模式

Basic

Allowed/NotAllowed

PerCall/Perssession

YES

PerCall

TCP,IPC

Allowed/Required

PerCall

No

PerCall

TCP,IPC

Allowed/Required

PerSession

Yes

PerSession

WS(no security,no reliability)

NotAllowed/Allowed

PerCall/PerSession

Yes

PerCall

WS(with security or reliability)

Allowed/Required

PerSession

Yes

PerSession

WS(with security or reliability)

NotAllowed

PerCall/PerSession

Yes

PerCall

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值