Orleans:构建高性能分布式Actor服务
上QQ阅读APP看书,第一时间看更新

3.2 任务模型及调度管理

在.NET环境中,异步编程模型的核心思想是通过Task和Task<T>对象对异步操作进行抽象,在C# 5.0及后续版本中,开发人员可以通过使用async/await关键字,按照同步语义编写并实现异步执行的代码逻辑。Orleans运行时依托于.NET异步任务编程模型并大量使用了async/await关键字以简化任务的新建、处理和等待逻辑,在Grain实例层面保证处理并发请求时的线程安全,使开发人员可以更加专注于业务逻辑的开发而无须处理烦琐的异步任务调用关系。

在Orleans运行时内部,通过Orleans消息组件发送到同一个Grain实例的所有客户端服务请求都将在该Grain实例上下文中被依次执行(见图3-2),即正在处理外部服务请求的活跃Grain实例对象都会占用Silo节点中的一个线程对象,并在该线程中依次处理外部服务请求:

•图3-2 Grain实例的请求及响应过程

在数据模型层面,开发人员可以认为每一个Grain实例对象都有一个与之对应的待处理请求消息队列,Grain实例对象会从待处理请求队列中依次取出任务并执行,所有等待处理的请求消息都将被阻塞。因此,Grain对象在服务接口中所提供的方法都需要被声明为异步方法,Grain引用对象会将远程请求封装成一个异步完成的任务(Task)对象执行,运行客户端程序进行异步调用以提高执行效率。

在.NET环境中,一个任务对象实际代表着一段可以独立参与线程调度的程序片段(即任务逻辑)和约定的返回值类型、任务执行所需上下文和当前任务的执行状态。当用户提交一段异步执行逻辑时,.NET运行时将自动根据代码逻辑构造出对应的任务对象并提交给对应的执行线程进行处理,而负责将任务对象分配给执行线程的管理器则为任务调度器(见图3-3),因此通过定制化的任务调度器可以实现上层业务所需的并行任务执行模型(如Orleans中Grain实例粒度的线程安全模型)。