2.2 Lazy Acquisition模式
Lazy Acquisition(延迟获取)模式把资源获取推迟到了系统执行的可能的最后一刻,以便优化资源使用。
1.问题
有限的资源可用性是所有的软件系统都面临的约束。此外,如果可用的资源没有正确管理,可能会给系统带来瓶颈,并且对系统的性能和稳定性带来显著影响。为了确保资源在需要时是可用的,大多数系统会在启动时获取资源。但是,早期获得资源会带来很大的获取开销,而且会导致资源浪费(特别是如果资源不是立刻需要的话)。
必须获取和管理昂贵的资源的系统需要一种方式来降低获取资源的初始开销。如果这些系统一开始就获取全部资源,那么会导致很大的开销,会有很多资源不必要地被浪费。在解决这些问题的同时,需要关注以下几点:
1)可用性(Availability)。资源的获取应当被控制为尽量减少资源短缺的可能性,并确保当需要时有足够数目的资源可用。
2)稳定性(Stability)。资源短缺会导致系统不稳定,所以资源应当以对系统稳定性具有最小影响的方式被获取。
3)系统快速启动(Quick system start-up)。在系统启动时对资源的获取应当被以优化系统启动时间的方式实现。
4)透明性(Transparency)。解决方案对资源使用者应当是透明的。
2.解决方案
在可能的最后一刻获取资源。除非不可避免,否则不去获取资源。当资源使用者一开始要求获取资源时,创建并返回一个资源代理。当资源使用者试图访问资源时,资源代理获取实际资源并把资源使用者的访问请求重定向到资源。因此,资源使用者依赖于资源代理,但既然资源代理提供的接口同资源一样,那么对于资源使用者而言,访问的是资源还是资源代理是透明的。
通过用代理来表示可能获取起来代价昂贵的资源,获取一组资源的总体代价可以最小化,而且,因为不在一开始就获取大量资源,所以需要同时管理的资源问题也最小化了。
3.结构
资源使用者获取并使用资源。
资源是一个连接或内存之类的实体。
资源代理(Resource Proxy)截获资源使用者对资源的获取,并把延迟获取的资源交给资源使用者。
资源提供者管理并提供多种资源。
4.实现
1)确认需要被延迟获取的资源。通过性能分析和系统分析,确认具有下列一个或多个属性的资源:
·获取起来代价昂贵的资源。
·数量有限的资源。
·在获取后很久未用的资源。
审视找出的每个资源及其使用情况,并决定如果改用Lazy Acquisition模式,总体资源可用性,系统稳定性和系统启动时间能否改善。对每个找出的资源应用后面的实现步骤。
2)定义资源代理接口。对于需要延迟获取的每个资源,都需要定义一资源代理为Virtual Proxy,它的接口同资源的接口完全一样。
3)实现资源代理。实现资源代理,使之隐藏对的延迟获取。资源代理只在资源使用者实际访问资源时才获取资源。一旦实际资源被获取,资源代理就使用委托来处理所有的资源请求。资源代理也可以负责在获取资源后将其初始化。
4)定义获取策略。 定义资源代理从资源提供者实际获取资源的策略。可以用Strategy模式来配置不同类型的策略。简单的策略可以是把资源的获取延迟至资源使用者访问资源。其他的策略可以是基于某个状态机来获取资源。例如,某个组件的实例化可能触发另一个已经存在的组件的资源代理去获得相应的资源。此外,资源代理还可以提供关闭延迟获取机制的能力,这样资源就会被立即获取。
5)为延迟获取的资源实现正确的资源释放机制。如果资源用户没有显式释放资源,那么或者使用Evictor模式或者使用Leasing模式来自动释放资源。这样一来,被延迟获取的资源分别需要实现EvictionInterface或者注册到租赁提供者。
5.结论
优点:
1)可用性(Availability)。使用Lazy Acquisition模式确保了所有资源都不会在一开始就获取。这有助于把系统缺乏资源以及获取不需要的资源的可能性降至最低。
2)稳定性(Stability)。使用Lazy Acquisition模式确保了资源只在需要时才会被获取。这避免了在一开始不必要地获取资源,从而降低了资源耗尽的可能性,使得系统更稳定。
3)优化系统的启动时间(Optimal system start-up)。使用Lazy Acquisition模式确保了不是立即需要的资源会在较晚的时候才被获取,这有助于优化系统的启动时间。
4)透明性(Transparency)。使用Lazy Acquisition模式对资源使用者而言是透明的,资源代理向资源使用者隐藏了实际的资源获取操作。
缺点:
1)空间开销(Space overhead)。这个模式会带来少许空间开销,因为间接性所需的代理需要额外的内存。
2)时间开销(Time overhead)。执行延迟获取会在获取资源时造成显著的延时,并且由于额外的间接层次的缘故,也会对正常的程序执行带来时间开销。对实时系统而言,这样的行为可能是无法接受的。
3)可预测性(Predictability)。延迟获取的系统的行为可能会变得无法预期。如果系统的多个部分都尽可能晚地获取资源,那么当系统的所有部分都同时尝试获取资源时性能曲线会有陡峭的变动。