在Ice有两种异步使用的方式,AMI和AMD。AMI是异步方法调用,AMD是异步方法调度(分派)。前者用在代理端,后者用在饲服实现端。

AMI其实就是在代理端,使用Future机制进行异步调用,而不阻塞等待响应结果。

AMD只是提供一种回调机制,让你可以选择返回响应的时机,不必在Skeleton调度(分派)你的方法调用最后返回响应,这样你可以制造一个barrier让一组响应同时返回。或者在你的方法实现中要依赖代理远程调用时,组合这个代理AMI方式,让你的响应操作在AMI完成事件回调处执行,这点是在饲服实现端进行AMI代理调用的必要前提。AMD方式让你的调用分派是否并发没有关系,因为是对象适配器使用线程池在并发分派你的调用。

我们先来看看一次Ice远程调用在不使用异步方式编程的活动流

在ActiveObject模式下,调用和调用调度执行分别在两条不同的控制流中进行。并且在调用执行之外的增加了不少开销,其中调用红色的活动是可能发生长时间等待,或消耗长时间处理,发而阻塞住活动所在的控制流。在调用方的控制流可能因为等待响应结果而阻塞,而远端调用调度执行的控制流也可能因为调用执行本身会等待事件或进行长时间任务而阻塞。所在不论在调用方的控制流抑或远端调用调度执行的控制流都需要应用异步编程的方法来避免阻塞。在调用方控制流使用异步编程的方法叫做AMI,远端调用调度执行的控制流使用异步编程的方法叫做AMD。一般地异步编程方法将一个任务分开两部分,分别在不同的控制流中执行,任务调度给别的控制流后将转入其它任务的执行上下文。

由于等待事件而阻塞控制流,则将等待事件和后续任务调度给其它控制流,然后离开当前任务的控制流。

由于任务中包含了长时间的子任务,则将长时间的子任务调度给别的控制流,然后离开当前任务的控制流。

因为在调用方(即使用代理方)的控制流上同步等待响应结果的话,就可能需要长时间阻塞当前控制流,所以在调用方等待响应结果的任务使用回调调度到其它控制流的编程方法就是AMI(Asynchronous Method Invoke)。

而在远端调用调度执行方,为了不阻塞调度(Dispatch)的控制流,使用异步编程方法就是AMD(Asynchronous Method Dispatch)。由于远端调用执行在调度的控制流上,至使因为一个长时间执行或需要等待的调用会阻塞调度控制流,从而不能调度其它请求的调用,降低调度请求的吞吐。将调用的响应任务做成可回调,就可以使调用执行从调度控制流中分离出来,不至阻塞住调度控制流。这就是AMD相关的框架设施为我们提供的服务。

下面是使用AMD方式的三种情况:

长时间执行的调用从调度流分离

在调用执行中依赖其它远程调用,要使用AMI,就必须依赖AMD,即在Servant端组合AMI到AMD使用。换句话说,当你看到一个接口的方法声明为["amd"]时,可能意味着这个方法的执行中依赖另外的代理(远程调用)。

第三种是用AMD来同步(Sync Barrier)响应输出。Barrier绝对不能做在调度控制流上,所以Barrier依赖AMD。有这么一种情况,调用在调度控制流的线程池中并发执行,响应的次序不能确保,而你需要确保响应有序,那么就必须设立一个Barrier,然后在Barrier处将响应重建次序。

ZeroC ICE的远程调用框架 AMI与AMD -Why?的更多相关文章

  1. ZeroC ICE的远程调用框架 Slice如何帮助我们进行Ice异步编程(AMI,AMD)

    Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架. 当Slice不为我们生成代码时,我们仍然可以按 ...

  2. ZeroC ICE的远程调用框架 AMD

    继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...

  3. ZeroC ICE的远程调用框架

    想搞清楚slice为我们生成了什么样的框架代码,就先搞明白Ice的远程调用框架暗中为我们做了些什么? Ice将Ice Object的方法调用分为三个阶段(或步骤),分别是begin,process和e ...

  4. ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架

    Ice框架提供了不少回调设施,其中一些是使用Ice远程调用进行ami模式或amd模式的支撑.本篇来看一下用于代理端的回调设施. Ice代码中有好几个Callback相关命名的基类,并且slice还会为 ...

  5. ZeroC ICE的远程调用框架 class与interface

    我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类.在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发. ...

  6. ZeroC ICE的远程调用框架 ServantLocator与Locator

    ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...

  7. ZeroC ICE的远程调用框架 ThreadPool

    ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如 ...

  8. ZeroC ICE的远程调用框架 代理引用地址

    在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...

  9. ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator

    ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...

随机推荐

  1. ES和zookeeper选取帮主之江湖秘闻

    ES帮会 某日,ES帮会中决定选取老大统领帮会走向辉煌.大家七嘴八舌,讨论方案,场面一顿混乱.傻牛站起来大喊一声:谁比俺力气大,谁就当老大.(ES集群在启动时,选取集群master,按照nodeId进 ...

  2. web常用知识

    Html 1.打电话,发短信和发邮件 <a href="tel:0755-10086">打电话给:0755-10086</a> <a href=&qu ...

  3. 关于explorer.exe文件或目录已损坏的问题

    2019-5-8 今天由于断电导致电脑异常关机,就出现了开机后屏幕是黑的,只显示鼠标,然后会有警告:explorer.exe目录或文件已损坏. 网上也有各种解决办法,但是都没有清楚,导致捣鼓了半天,首 ...

  4. Ajax自我总结

    一念起.万水千山皆有情. 一念灭.沧海桑田已无心.     ------ 随记 本文主要针对ajax原理介绍,很少涉及实例,主要用于对知识的梳理总结,方便以后学习和查询... Ajax 一.Ajax是 ...

  5. Windows 程序包管理器 Chocolatey:一条命令装软件

    Windows 程序包管理器 Chocolatey:一条命令装软件 本文原始地址:https://sitoi.cn/posts/46278.html 介绍 Chocolatey 是一种软件管理解决方案 ...

  6. SpringBoot集成JWT实现权限认证

    目录 一.JWT认证流程 二.SpringBoot整合JWT 三.测试 上一篇文章<一分钟带你了解JWT认证!>介绍了JWT的组成和认证原理,本文将介绍下SpringBoot整合JWT实现 ...

  7. MIT线性代数:20.克拉默法则,逆矩阵和体积

  8. CSPS模拟 51

    蒟蒻由于仍然苟活在$1jf$,不得不接受省选题的吊打$QWQ$ 蒟蒻由于拿了大神们不屑打的弱智暴力,而大神们$T3$的各种快速变换没调出来,所以拿到辽人生第一个$1jf$黄名 既侥幸又$kx$ T1 ...

  9. 使用Typescript重构axios(十六)——请求和响应数据配置化

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  10. centos7 yum 安装 mysql5.7

    1.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysqlyum list installed | grep mysql 2.如果已安装则删除 MySQL ...