大家好,又见面了,我是你们的朋友全栈君。
服务器实现技术
1. 渐进的初始化
如果我们使用servant定位器,locate返回的servant只能用于当前请求,也就是说Ice run time不会把这个servant增加到Active Servant Map中。
一种常用的实现技术是,在locate中,把每个servant增加到ASM中。这意味着,只有对Ice对象的初次请求会触发对locate的调用;自此之后,与Ice对象对应的servant就可以在ASM中找到,Ice run time不必再调用servant定位器就可以立即分派针对同一个Ice对象的到来请求。
使用一个把servant增加到ASM中的定位器有一些优点:
1) Servants是随需实例化的,所以servant的初始化代价分散到了许多次调用中,而不是在服务器启动时同时产生。
2) 服务器的内存需求降低了,因为只有当Ice对象被客户实际访问时,servant才会实例化。
2. 缺省Servants
缺省Servants是—它针对每一个请求,充当不同的Ice对象的角色。换句话说,缺省servant会在处理每个请求时,根据请求所访问的对象标识改变其行为。通过这样的方式,客户可以访问数量不限的Ice对象,但却只有一个servant在内存中。
缺省Servants不仅可以节省内存,实现方式也很简单:在本质上,它们就是数据库中对象的持久状态的façade。
要创建缺省servant实现,我们需要的定位器的数量和系统中的非抽象接口的数量一样多。而对于每一个被调用的操作,缺省servant都要进行一次数据库访问,因此它比在内存中缓存状态要慢。
3. 混合途径及缓存
如果我们的应用有一些经常访问的对象,是性能的关键,那么我们可以把针对这些对象的servant增加到ASM中。其他不常被访问的对象可以通过缺省servant实现。
4. Servant逐出器
逐出器是维护有servants缓存的servant定位器:最近最少用的servant处在队列的尾部,最近使用最多的servant处在队列的头部。(按照LRU顺序维护)。
队列的长度可以配置,并决定会有多少servant存放在缓存中:如果针对某个Ice对象的请求在内存中没有对应的servant,而且缓存满了,逐出器就会在队尾移除最近最少用的servant,给要在对头实例化的servant腾出空间。如:
逐出器在访问了servant3之后的情况:
假定下一个客户请求时针对对象标识6的。逐出器中维护servants的缓存已经满了,那么就会在队尾逐出标志位1的servant,如图:
逐出器集合了ASM与缺省Servants的优点:只要缓存尺寸能在内存中容纳servant工作集,大多数的请求都会由已经实例化的servant提供服务,而不用创建servant,并访问数据库来初始化servant状态。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135437.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...