zoukankan      html  css  js  c++  java
  • 《面向模式的软件体系结构3资源管理模式》读书笔记(9) Leasing模式

    4.1 Leasing模式

          Leasing(租约)模式通过在获取资源时把资源同基于时间的租约相关联而简化了资源释放。当租约过期并且没有被更新时,那么资源就会被自动释放。

    1.问题

          高度健壮和可伸缩的系统必须高效地管理资源。资源可以有很多种类型,包含本地和分布式服务、数据库会话以及安全令牌。在典型的用例中,资源使用者获取资源提供者的接口,然后向提供者要求一个或者多个资源。假定提供者给予了资源,那么资源使用者就会开始使用资源。但是,过了一段时间之后,资源使用者可能不再需要其中的一些资源。除非资源使用者显式地终止和提供者的关系并释放资源,否则不用的资源依然会被不必要地占用。这会进而导致资源使用者和提供者的性能下降,还会影响资源对其他资源使用者的可用性。

          在资源使用者和资源提供者都是分布式的系统中,可能过了一段时间之后,提供者所在的机器会崩溃,或者提供者不再提供某些资源。除非资源使用者显式地被提示资源不再可用,否则的话资源使用者可能会继续引用无效的资源。

          所有这些导致的结果就是资源使用者这边可能有一些资源永远都不会被放弃。这个问题的一个解决方案是使用某种监控工具,间歇性地检查用户的资源使用情况,以及资源使用者使用的资源的情况。这个工具可以建议资源使用者释放的资源。但是,这一方案既麻烦又容易出错,而且,监控工具也不利于性能。

          为了以有效且高效的方式解决这一问题,需要关注以下几点:

          1)简单性(Simplicity)。对资源使用者而言,资源管理应该简单,可以让资源使用者可选地释放不再需要的资源。

          2)可用性(Availability)。资源使用者不再使用的资源,或者不可用的资源,应当立刻被释放,以便让它们可以被新的资源使用者使用。例如,同网络连接关联的资源应该在连接断开之后就被释放。

          3)优化(Optimality)。不使用的资源造成的系统负担应该最小。

          4)真实性(Actuality)。当有新的资源可用时,资源使用者不应该使用资源的过期版本。

    2.解决方案

          为每个被资源使用者使用的资源引入一个租约。授予者提供租约,持有者获得租约。租约授予者通常是资源提供者,租约持有者通常是资源使用者。租约说明了资源使用者可以使用资源的时间长度。

          如果资源被资源使用者所持有,那么一旦超过了时间期限,我们就说租约过期了,相应的资源就被资源使用者释放。另一方面,如果资源被资源提供者所持有,而资源使用者持有到资源的引用,那么租约过期的时候资源的引用就变得无效,并由资源使用者释放。此外,资源提供者也可以释放资源。

          在租约有效的时候,租约持有者可以取消租约,在这种情况下相应的资源也被释放。在租约过期之前,租约持有者可以向租约授予者申请延长租约。如果租约被延长,那么相应的资源继续可用。

    3.结构

          资源提供某种类型的功能或者服务。

          租约(Lease)提供一种时间的记法,可以同资源的可用性相关联。

          授予者(Grantor)授予资源的租约。租约的授予者通常就是资源提供者。

          持有者(Holder)获得资源的租约。租约的持有者通常就是资源使用者。

          

           

    4.实现

    1)决定要关联租约的资源。所有可用性基于时间的资源都可以关联租约。这包含了生命短暂的,不连续使用的资源,以及会频繁被新版本更新的资源。

    2)决定租约创建策略。租约授予者会为每个使用的资源创建租约。如果多个资源使用者共享一个资源,那么会为资源创建多个租约。租约授予者可以使用工厂来创建租约。租约创建时要求说明租期。租期可以取决于资源的类型,请求的租期以及租约授予者的策略。租约请求者和租约授予者可以就将授予的租约的租期进行协调。

        资源使用者可能会想把资源以及相关的租约传递给另一个资源使用者,可以用租约创建策略来说明是否可以这样做。如果资源及其相关联的租约可以被传递给其他资源使用者,那么租约就需要提供操作以便让它的所有关系可以改变。

    3)提供租约持有者功能。每个租约持有者都必须实现一个通告接口,租约授予者可以通过这个接口来通知租约持有者租约过期。当资源使用者从租约授予者那里获取了一个资源及其对应的租约时,它将会把这个接口注册到租约授予者。资源使用者可以在该接口里实现释放租约过期的资源。

    4)提供租约授予者功能。一旦租约被创建,授予者就需要维护租约和相应资源之间的映射。这使得授予者可以跟踪资源被使用的时间,并且决定对此资源是否依然可以授予新的租约。

        此外,为了支持对资源使用者的通告,租约到相应资源使用者的映射也是必要的。Observer模式描述了如何实现这样的通告。

    5)决定租约职责。如果租约可以被更新,那么有必要决定由谁来负责更新。如果租约是一个活动实体,那么它可以自动更新自己,否则的话更新过程可能就需要授予者与持有者重新协调。对租约的重新协调可能会导致租约的新策略,包括租约更新的时间。 

    6)决定租约过期策略。一旦租约过期并且没有更新,那么同它关联的资源就需要被释放。这可以自动进行,比如使用Evictor模式,或者要求资源使用者的干预。类似地,租约授予者需要删除租约,资源和资源使用者之间的映射。通常租约包含某种携带关于它的持有者信息的Asynchronous Completion Token(异步完成标记),以便可以在租约过期时正确地完成清除工作。

    5.结论

    优点:

    1)简单性(Simplicity)。Leasing模式为资源使用者简化了资源管理。一旦资源的租约过期,资源使用者没有更新它,那么就可以自动释放资源了。

    2)使用效率(Efficiency of use)。资源提供者可以更有效率地控制资源的使用。通过把资源的使用与基于时间的租约相绑定,资源提供者可以通过尽快释放不使用的资源来避免浪费,这样就可以把资源交给新的资源使用者,这可以把不同的资源带来的系统开销最小化。

    3)版本控制(Versioning)。Leasing模式使得资源的旧版本可以相对容易地被新版本替换。资源提供者可以在租约更新的时候向资源使用者提供新版本的资源。

    4)增强系统稳定性(Enhanced system stability)。Leasing模式有助于提高系统的稳定性,这是通过确保资源使用者不会访问失效的资源来做到的。此外,Leasing模式还有助于减少不用的资源的浪费,从而避免资源短缺。

    缺点:

    1)额外的开销(Additional overhead)。Leasing模式要求为资源提供者提供给资源使用者的每个资源都创建一个额外的对象(租约)。为租约对象建立一个池并对不同的资源分配重用它们可以帮助缓解这个问题。此外,当租约过期的时候,资源授予者需要发送通知给资源使用者,这也导致了额外的开销。

    2)额外的应用程序逻辑(Additional application logic)。Leasing模式要求应用程序逻辑支持“作为资源使用者和资源提供者之间的脱水”的租约概念。应用程序架构师需要牢记资源不是无限的,它们不是永远可用的。把重复的租借代码放入框架可以减轻编码复杂性。

    3)定时监视器(Timer Watchdog)。资源提供者和资源使用者都需要能够判断资源何时过期。这就要求某种定时器机制的支持,这在一些遗留系统中可能做不到。但是,如果遗留系统是基于事件的应用程序,那么只需要很少的开销就能让它们可以感知定时器。 

  • 相关阅读:
    【TECH】CAS php客户端配置
    【Tech】CAS多机部署Server和Java Client端
    【Tech】CAS RESTful API使用笔记
    【读书笔记】《Java Web整合开发实践》第3章 JSP
    MVC
    Echarts
    AutoMapper
    EntityFramework 二
    EntityFramework 一
    C# 基础复习 四 多线程
  • 原文地址:https://www.cnblogs.com/pennant/p/2730430.html
Copyright © 2011-2022 走看看