议题
1.
异步服务概览
2.
客户端异步方法
-基于代理的开发模式
3.
异步服务器端行为
-Soap one-way方法
-WSE
-SoapMSMQ
异步方法概览
异步方法
–
不必等方法处理完成而直接返回
–
可以在服务器和客户端上实现
客户端异步方法
–
完全在客户端实现
–
通常在proxy或者plumbing层中实现
异步服务器端行为
–
用于改善服务器扩展性
–
作为同步方法的一部分实现
异步方法概览
动机
对于同步方法
–
UI线程依赖于方法的实现
方法执行时间过长将导致UI无法及时与用户进行交互
–
服务器线程受到其他服务器的支配
线程是稀缺资源
–
在Windows客户端中,每一个进程都有单一的UI线程
–
在服务器中,可扩展性依赖于线程的使用
对于异步方法
–
在用户交互方面
提供良好的用户体验
及时交互响应
–
在服务器
改善可扩展性
将服务器与通讯问题隔离
客户端异步方法
基于Proxy的方法
异步行为的最简单类型
缺省方式
–
Visual Studio和WSDL.exe直接支持
–
客户端代理包含异步方法
效果和影响
–
改进UI响应度
–
在服务器不需要实现异步操作
对服务器透明
–
客户端能够在任何时间选择阻塞
WSDL.EXE可以生成异步方法
–
将方法放入调用队列就立即返回
–
通过.NET异步编程模式
通过BeginInvoke/EndInvoke实现
–
充分利用delegate和IASyncResult特性
Begin×××和End×××
Begin×××返回IASyncResult
客户端可以轮询、等待或者delegate方法
结束状态查询方法
–
轮询ISAyncResult.IsComplete以判断处理是否结束
允许客户端继续其他工作
–
使用IAsyncResult.AsyncWaitHandle
允许客户端使用Wait处理语义
–
调用delegate方法
等待被运行时调用的delegate
–
阻塞调用End方法
最简单模型
线程池
客户端线程池
–
性能较IAsyncResult略高
–
对于无响应的请求特别有用
–
Dlegate能够被异步调用
WaitCallBack
QueueUserWorkItem
–
支持delegate方法调用
–
可以选择提供参数对象
服务器端异步方法
在服务器端实现异步方法
实现方式
–
BeginInvoke/EndInvoke
–
Soap one-way方法
–
Web Service Enhance(WSE)
–
MSMQ
One-Way
将单向消息发送到端点
–
例如:不需要响应的请求
问题
–
没有返回值
–
无法断盘方法结束时间
对于结果需要显示的通知或者轮询
通知
从端点发送的单向消息
客户端通知策略
–
客户端能够轮询完成状态
要求客户端提供相关令牌
注意可扩展性问题
–
服务器能够通知客户端
WS-Eventing或者类时机制
广播通道
One-Way方法实现
使用[SoapDocumentMethod]定义One-way方法
–
[SoapDocumentMethod(OneWay=true)]
–
数据包反序列化后,服务器端方法立即返回
–
客户端方法不会从调用的服务器端方法中收到返回值
One-way方法不适用于
–
方法需要对结果轮询
其他方法更加适合
–
方法需要同步
WSE
WSE支持面向消息的编程
–
SoapSender和SoapReceiver基类
–
支持发送和接收SoapEnvelopes
–
更多的事务模型
通过SoapClient和SoapService提供
SoapSender和SoapReceiver
–
客户端和服务器同时实现
–
客户端使用SoapSender发送消息
可选择使用SoapReceiver接收消息
–
服务器使用SoapReceiver接收消息
可选择使用SoapSender发送通知和回应
使用MSMQ
MSMQ用于消息传输
n
适用于Web Service
n
具有可靠的异步行为
- 要求能够在服务中提供可靠的队列
- 允许多监听者使用单一队列
n
支持事务
- 同时支持本地事务和企业事务
- SWC安装在Windows Server 2003和Windows XP SP2 中
Claim-Check模式
n
提供主要的异步解决方案
- 使用同步方法来接收请求
- 返回用于获得服务状态的令牌
- 绝大部分工作表现为异步
n
同步方法
- 检查输入参数和业务逻辑规则
- 事务记录请求
- 带有令牌的相关请求
n
异步部分
- 处理请求
- 发送请求通知
Claim-Check模式实现
Web Service和MSMQ能够进行整合
n
使用企业服务来协调事务
- 数据库记录请求
- MSMQ事务持久的向队列添加请求
n
异步方法使得事务变得复杂
- 没有可行的方法确定一个事务的边界
- 当请求删除队列时,需要保证事务性
n
下面是我们所不希望的
- 服务丢失请求
- 请求处于不一致状态
使用WSE进行MSMQ操作
SoapMSMQ
n
简化使用WSE进行MSMQ操作
n
开源软件
n
完全支持事务
- 要求下列Claim-Check模式
- 在事务中,请求要被同步初始化
- 同步阶段排队请求,并且返回令牌
- 异步阶段处理各个事务
- 所有持有令牌的请求都保证会被处理,但可能会不成功
- 支持向客户端发送通知
总结
n
异步方法能够
- 改善客户端响应
- 增加服务器端的扩展性
n
对于异步开发的广泛选择
- 客户端异步代理方法
- 使用Soap one-way方法
- WSE SoapSender和SoapReceiver
- WSE自定义SoapMSMQ传输