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 |