2.4 Partial Acquisition模式
Partial Acquistion(部分获取)模式描述了如何把资源获取分成多个阶段来优化资源管理。每个阶段都获取资源的一部分,这取决于系统的约束,比如内存以及其他资源的可用性。
1.问题
具有高健壮性和可伸缩性的系统必须高效地获取资源,包括本地和远程的资源。预先获取资源对于满足资源的可获得性和可访问性限制很重要。但如果这些系统都在一开始就获取全部资源,那么就会带来很大的额外开销,会浪费很多资源。而另一方面,延迟获取所有资源也是不现实的,因为有的资源可能在应用系统启动或恢复的时候就要用到,为了解决这些冲突的资源获取需求,我们需要关注以下几点问题:
1)可用性(Availability)。资源获取应当受参数(比如可用的系统内存、CPU负载、其他资源的可用性)的影响。
2)灵活性(Flexibility)。解决方案应当对固定尺寸的资源和未知或者不可预测尺寸的资源工作得同样好。
3)可伸缩性(Scalability)。解决方案应当对资源的尺寸具有可伸缩性。
4)性能(Performance)。资源的获取应当对系统性能的影响尽可能小。
2.解决方案
把资源获取分成两步或者更多步。在每一步中,获取资源的一部分。每步获取资源的数目都应当用一个或多个策略来配置。例如,每步获取的资源的数目可以取决于考虑到可用缓冲区。系统响应时间需求以及所依赖的资源的可用性的策略。当一个资源被部分获取时,资源使用者就可以开始使用它,假定使用之前不需要获得完整的资源。
可以用Eager Acquisition和Lazy Acquisition之类的模式来决定何时执行部分获取资源的一步或者多步。Partial Acquisition模式则决定了资源应该分多少步获取,还决定了每一步获取的资源的比例。
3.结构
资源使用者获取并使用资源。
资源是一个实体(比如影音/视频内容),资源被分多步获取。
资源提供者管理并提供多个资源。
4.实现
1)决定步骤的数目。资源应该分多少步获取取决于系统约束,比如可用的内存和CPU,以及其他的因素,比如时间限制和所依赖的资源的可用性。对于未知或者不可预测尺寸的资源,可能无法决定要分几步来获得整个资源,在这种情况下,步骤数没有上限,会一步步执行下去直到完整地获得资源。
2)选择获取策略。决定何时应该执行资源获取的哪一个步骤,可以用Lazy Acquisition和Eager Acquisition之类的模式来控制何时应执行一个或多个资源获取步骤。例如,可以用Eager Acquisition模式来获取资源的起始部分,然后用Lazy Acquisition模式来获取资源的剩余部分,或者在某个系统启动完成之后但用户还没有请求资源的中间时间来获取。
3)决定获取多少。配置策略来决定每一步要部分地获取多少资源。可以配置不同的策略来决定每一步获得多少资源。如果资源的尺寸是确定的,那么可以用简单的策略,平均分配每一步所获得的资源。更复杂的策略会考虑可用的系统资源,例如,当具有足够内存的时候,这样的策略可能会在一步中获得较多部分的资源。稍后,当系统资源不足的时候,这样的策略可能会获取较少部分的资源。
如果要获取的资源的尺寸未知或者不可预测,那么可以用这样的自适应策略。还可以配置其他的策略来利用其他的参数,比如需要的相应时间。如果没有系统约束,那么另一个策略可以贪心地尽可能多地获取资源。这样的策略可以保证整个资源在可能的最短时间内被获得。为了判断使用何种策略比较合适,有必要良好地理解应用程序的语义。
4)引入缓存(可选项)。决定是否要把部分获取的资源缓存起来。如果资源尺寸未知,或者整个资源使用前需要在某处合并,那么缓存资源是有用的。如果资源需要被缓存,那么需要决定分配多大空间的缓存区,以确保可以装入整个资源。对未知或者不确定大小的资源,分配的缓冲区尺寸应该在系统限制(比如可用内存)之内,但又要足够大,以处理系统中资源尺寸的上限。
5)实现获取触发器,建立一个负责执行资源获取的每一步的机制。这样的机制应当负责用多个步骤来获取资源的不同部分。Reactor(反应器)之类的模式可以用于实现这样的机制。
6)处理错误条件和部分失败。错误条件和部分失败是分布式系统的特性。当使用Partial Acquisition模式时,有可能会在一步或者多步结束之后出错。结果可能是获取了一部分资源,但是试图接着获取资源的剩下部分会失败。取决于应用程序的语义,这样的部分失败可能可以结束,也可能不可以接受。
处理部分失败的一种方式是使用Coordinator模式。这个模式有助于确保资源获取的所有步骤都成功完成,或者确保一步都没有成功。
5.结论
优点:
1)反应式行为(Reactive behavior)。Partial Acquisition模式使我们可以获取缓慢地变得可用或者局部可用的资源。如果不使用Partial Acquisition模式,资源使用者就不得不等待不定长的时间以等待整个资源变得可用。
2)可伸缩性(Scalability)。Partial Acquisition模式允许要获取的资源的尺寸具有可伸缩性。资源获取的步骤数目可以依据要获取的资源的尺寸来配置。
3)可配置性(Configurability)。Partial Acquisition模式可以用一个或多个决定分多少步获取资源以及一步获取多少资源的策略来配置。
缺点:
1)复杂性(Complexity)。用户处理资源的算法需要可以处理只获得了一部分的资源。这可能会给应用程序带来一定程序的复杂性。此外,用Partial Acquisition模式会导致错误处理变得更为复杂。如果某一步失败了,那么错误处理策略必须确保完整的动作被重新执行或者更正。另一方面,错误处理也会变得健壮。如果某一步获取失败,那么可以重新执行同一步而不需要重新进行全部获取操作。
2)额外开销(Overhead)。Partial Acquisition模式要求资源分步获取。这可能会带来额外的调用开销(多次调用以获得相同资源的不同部分)。