Servant定位器
之前介绍了ASM表(servant活动映射表)的作用。不过他也会有一些限制,因为如果是使用适配器的ASM来把Ice对象映射到servents,那么会有一些影响:(1)每个Ice对象都有一个不同的servant代表。(2)所有Ice对象的所有servants都永久性的出在内存中。如果有大量的上servant对象的话,那么服务器将会承受大的压力,或许是内存不够,或许是初始化所有servants的时间很长。
1. locator综述
Servant定位器是一种本地对象,我们负责实现它,并把它息道对象适配器上。适配器一旦有了servant定位器,它可以和平常一样查询ASM,对servant进行定位。如果ASM上能找到相对应的servant,请求就会分派给这个servant。如果找不到的话,对象适配器就会回调servant定位器,它为该请求提供servant。Servant定位器会做一下事情中的一件:
--初始化一个servant,把它传给Ice run time,这种情况下,请求会被分派到这个新实例化的servant。
--servant定位器告诉Ice run time,他没有找到相应的servant。这种情况下,客户会受到ObjectNotExistException的异常。
采用这种简单的机制,我们的服务器能让我们访问数量不限的Ice对象:服务器不必为每一个现有的Ice对象实例化一个单独的servant。提供数据库访问的服务器常常使用servant定位器:数据库中的条目数通常远远大于服务器在内存中能够存储的条目数。用于进程控制或网络管理的服务器也常常会使用servant定位器。
2. Servant定位器接口
module Ice {
local interface ServantLocator {
Object locate( Current curr,out LocalObject cookie);
void finished( Current curr,Object servant,LocalObject cookie);
void deactivate();
};
};
ServantLocator是一个本地接口。为了创建实际的servant定位器实现,我们必须定义一个从Ice::ServantLocator派生的类,并实现locate,finised以及deactivate操作。
locate:只要有请求到达,而且他在ASM中没有对应的条目,Ice run time就会调用locate。
finished:一旦请求完成,Ice run time就会调用finished,把完成了操作的servant、该请求的Current对象以及locate在一开始创建的cookie传给它。这意味着,每一个locate都会有一个对应的finished。
Deactivate:当servant定位器所属的对象适配器接解除激活时,Ice run time会调用deactivate操作。
3. 针对Servant定位器的线程保证
在必要时,我们必须使用互斥原语,在locate和finished中对共享数据进行保护。
4. Servant定位器的注册
对象适配器不会自动的了解到一个servant定位器,我们要显式地向对象适配器注册servant定位器。
module Ice {
local interface ObjectAdapter {
// ...
void addServantLocator(ServantLocator locator,
string category);
ServantLocator findServantLocator(string category);
// ...
};
};
由上可以看出对象适配器允许我们增加和查找servant定位器。以下是servant定位器的简单功能流程示意图:
5. 使用cookies
有时,我们需要在locate与finished之间传递信息。例如,locate的实现可以根据负载或可用性,从多种数据库后端选取一种;同时,为了适当执行结束工作,finished的实现可能需要知道locate使用的是哪一种数据库;在操作调用完成之后,Ice run time会把这个cookie的值传给finished。
Cookie必须从Ice::LocalObject派生,可以容纳任何对我们的实现有用的状态和成员函数。
分享到:
相关推荐
iceberg-hive-runtime-0.11.0.jar
flink-1.13.2 iceberg0.13
iceberg-flink-runtime-1.16-1.3.1.jar 数据湖
iceberg-spark-runtime-3.2_2.12-1.3.1.jar 实时数仓 数据湖
ICE-2.0.3-for-64-bit-Windows, window10可用的图像拼接工具
python库,解压后可用。 资源全名:zeroc_ice-3.7.0-cp36-cp36m-win_amd64.whl
iceberg jar包下载
ice 第三方基础库windows安装包,Ice-3.5.1-4-ThirdParty
iceberg0.13 hive
rpm -ivh Ice-3.5.1-el6-x86_64-rpm.tar.gz
IceCream-masterIceCream-master
windows版,ICE-3.5.1第三方库;ICE(Internet Communications Engine)是ZeroC提供的一款高性能的中间件,基于ICE可以实现电信级的解决方案。
ice最简单实现 ruby调用ice接口 - Ruby - language - ITeye论坛
iceberg-flink-runtime-0.11.0
Ice-3.6.4-msvc2015.msi zero-ice msvs2015 Ice-3.6.4-msvc2015.msi zero-ice msvs2015
ice-3.4.2-1.rhel6.noarch.rpm ice-libs-3.4.2-1.rhel6.i386.rpm ice-java-3.4.2-1.rhel6.noarch.rpm ice-java-devel-3.4.2-1.rhel6.i386.rpm ice-utils-3.4.2-1.rhel6.i386.rpm ice-servers-3.4.2-1.rhel6....
斯科茨曼Ice1-2-3制冰机
资源分类:Python库 所属语言:Python 资源全名:alibabacloud_ice20201109-1.0.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
ICE-3.7.4 最新安装文件msi文件,windows版 ICE常见报错 Exception in thread Ice.ConnectionRefusedException error = 0 at IceInternal.Network.doFinishConnect(Network.java:417) at IceInternal....
ice-dubbo-thrift-grpc性能测试对比 ,ice-dubbo-thrift-grpc性能测试对比,ice-dubbo-thrift-grpc性能测试对比,ice-dubbo-thrift-grpc性能测试对比