在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. HDU 1532 Drainage Ditches(最大流 EK算法)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路: 网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替 ...

  2. Exception evaluating SpringEL expression:

    Exception evaluating SpringEL expression:错误 说明: 在帮助同事看BUG的时候遇上了这个问题,不知道是前端还是后端的错误 在网上找了很多文章解决的方法,很多都 ...

  3. git jenkins 基本部署 gitlab私有仓库

    从代码私有性方面来看,公司不希望员工获取到全部的代码,这个时候 GitLab 无疑是最佳的选择.但对于开源项目而言,GitHub 依然是代码托管的首选平台. 1.安装gitlab[root@gitla ...

  4. Java properties | FileNotFoundException: properties (系统找不到指定的文件。)

    文件存储路径的问题 错误描述 :FileNotFoundException: init.properties (系统找不到指定的文件.) 1.方法一 InputStream fis =TestProp ...

  5. Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key

    一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...

  6. 品优购(IDEA版)-第一天

    # 品优购(IDEA版)-第一天 品优购IDEA版应该是2019年的新项目.目前只有视频.资料其他都还是旧的. ## 1.学习目标 1:了解电商行业特点以及理解电商的模式 2:了解整体品优购的架构特点 ...

  7. SpringBoot2.1.9+dubbo2.7.3+Nacos1.1.4构建你的微服务体系

    简单几步使用最新版本的DUBBO构建你的微服务体系 NACOS注册中心 从github下载最新版本的nacos 上传至服务器并解压 单机启动sh startup.sh -m standalone na ...

  8. 前端技术之:如何运行使用了ES(import)的node程序

    方式一: 在package.json文件的scripts域中,配置以下的命令:   "start": "cross-env NODE_ENV=dev node -r es ...

  9. MIT线性代数:22.对角化和A的幂

  10. 学习笔记07axps页面

    apsx分前台文件和后台文件,前台文件(子类)是继承了后 台的aspx.cs(父类), 1.在aspx中,使用<% %>能执行一段C#代码使用<%=C#代码%>,就是直接向前台 ...