下层可扩展性解决方案:聚合集合

没有解决方案的问题有什么好的?在《负载增长时悄然袭来的42个怪兽问题》一文中,我们讨论了一些问题;在这篇文 章(早些时候有过一篇文章,我会重新组织一下内容)里,我们将讨论我所谓的聚合策略(aggregation strategies)。

请牢记,这些都是下层架构方面的一些建议,比如如何组织代码组件的结构,它们该如何交互。本文不会讨论大规 模集群,但是会讨论你的应用程序在内部——在服务接口之下的深层——可能是什么样的。这个世界上除了事件架构之外, 还有很多东西。

聚合,简单说来就是不用愚蠢的队列,我们的队列会很聪明。我们打心底里把队列视为工作内容的 容器,该容器最终会呈现出整个系统是如何工作的。作为工作内容的容器,我们熟知队列里会有什么请求和数据,我们可以 把这种情报作为我们巨大的优势。

合理排序工作内容

此处的关键理念是一个基本上必须要牢记于心的设计方 法,有程序员将其视为一等概念——在工作创建时的方方面面里什么该做,为什么要做它,该什么时候做这三个问题的优先 级。

避免级联故障

为什么合理排序工作内容如此重要?我们要避免的最不靠谱的情况就是级联故障。天真的 系统没有合理排序的理念,在故障发生时,会让无用的控制层或数据层流量挤占必要的控制流量。

如果你需要向交 换机发送一个请求,对路由进行重新编程以对流量做故障转移,如果此时低优先级的工作项造成了线端拥塞(head-of-line blocking),那么在不关闭整个系统的情况下,你将永远都无法获得系统的控制权。那些不了解情况的啰嗦的程序会不断发 出低优先级的控制和数据流量,让系统一直处于繁忙状态,而做的事情却一点用都没有。这就好像代码中的垃圾食品。

一个了解优先级的系统会试着在确保高优先级的工作按时完成的同时避免无用的工作。用于控制的网络和数据网络 是各自独立的,因此控制消息能自由通行。你会有智能重试策略,无用工作不会占据队列,作废的消息会从队列中剔除。在 网络各处都要考虑缓存,确保不会看到老的版本。当最新的消息入主之时,可以用控制消息来暂停当前的工作,这样才能处 理更高优先级的工作,它们的消息会立即发送出去,而非进入等待。为了让系统更强健,有很多非常酷的事情可做。

处理无限的工作负荷

排定优先级是处理无限工作负荷的关键思想,在《负载增长时悄然袭来的42个怪兽问题 》里就讨论过这一点。传统观念里我们认为100% CPU使用率是一个不好的信号。作为补偿,我们制造了复杂的基础设施对工 作进行负载均衡、状态复制、构建服务器集群。CPU是不会疲劳的,所以我们可以将其榨干。当我们讨论排定优先级时,我 们也在讨论系统在全负荷下如何做出漂亮的、可预见的反应。如果我们进行了合理的条件设置,这些都不成问题。只有对于 那些架构天真的软件而言,这才会成为问题。

有意识的控制

合理排序的工作内容中说到开发者应该对以下内 容进行有意识的控制:

什么工作该做,什么工作该扔

处理工作的顺序

处理工作的任务优先级

给予工作的资源量:

CPU时间

内存

队列空间

磁盘

网络

你可能会注意到典型的编程环境里,你对这些内容的控制力都不强。必须改变这一点。

找出优先级

合理 排序工作内容也是很多其他领域的可扩展性解决方案里的常见做法。排定优先级需要对系统正在发生什么,以及你希望系统 里正在发生什么有一个深刻的理解。优先级取决于:

客户

请求类型

尝试提供公平的服务

请求数

已使用的资源量

需要的资源量

合约中的截止日期

SLA

除了避免级联故障之外,将拥抱优先级作为基本概念的另一个关键原因是为了保证SLA。

你有一个高 优先级的客户,他为了获得优于普通客户的服务而付费。为了实现他们的SLA,系统中的所有组件都必须习惯于理解优先级 ,同时还不能让其他客户处于饥饿状态,为他们提供周到的服务。

这和OS任务调度以及网络流量调度有很多共同之 处。其中的思想是一样的,但开发者需要在系统里运用这些思想。

合并聚合

合并聚合就是把单独的数据和/ 或命令合并到一起。其理念就是按固定限定成比例地使用资源。

例如,假设一个对象有如下命令序列:

新建

更新

更新

时间: 2024-09-28 13:24:00

下层可扩展性解决方案:聚合集合的相关文章

Windows XP 19技常见问题解决方案大集合

编者按:Windows XP操作系统使用过程中,遇到问题怎么办呢?下面就看一下我们为大家准备的这个解决方案大集合吧. 一.修改IE的标题栏 即在IE浏览器最上方的蓝色横条里做广告,而不是显示默认的"[M$] Internet Explorer".这种修改非常常见,有人也特意针对它编制了反修改的程序. 注册表法 HKEY_LOCAL_MACHINE\Software\[M$]\Internet Explorer\Main HKEY_CURRENT_USER\Software\[M$]\I

SVN代码冲突解决方案小集合

对于刚接触svn的人来说,svn冲突后,不能提交是件让人很郁闷的事情.最让人郁闷的事,是代码间的覆盖.你把我代码盖了,我会很火大的.谁把谁的盖了都不爽. 为什么会出现代码冲突问题呢,因为不同的人,同时修改了同一个文件的同一个地方,这个时候,他提交了,你没有提交,你就提交不了,这个时候,你要先更新,更新就会出现代码冲突问题.一般情况,要尽量避免多个人修改同一个文件,如果你改的文件是公用文件,这个时候,最好和大家勾通一下,大家都在改就不好了. 结合别人修改的内容和自己修改的内容,然后把文件中的<<

FTTH优秀解决方案

光纤接入网是依托于光纤的,把用户端口延伸的一系列物理实体和解决方案的集合,基于EPON/GPON技术的FTTH全光接入网是光纤接入网发展到一定阶段的必由之路. 在多年的市场探索中,通信制造企业对全光接入网给出了各自最为全面的理解. 中兴.烽火通信.UT斯达康.润欣通信.盛立亚等企业一直积极致力于FTTH的技术研究.开发和应用推广,并取得重大突破.这不仅标志着我国已经完全独立掌握了EPON.GPON多项核心技术,而且也进一步促进了全球光纤接入技术向FTTH的大幅迈进. 中兴通讯FTTH全面解决方案

java容器 collection-JAVA中什么是容器?什么是集合?求大神指导

问题描述 JAVA中什么是容器?什么是集合?求大神指导 容器是什么?跟接口是什么关系?集合又是什么?求大神帮忙?????? 解决方案 Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),AttributeList(1.5),RoleList(1.5),RoleUnresolvedList(1.5), ConcurrentLinkedQueue(1.5),Ar

Java 8新特性之旅:使用Stream API处理集合

在这篇"Java 8新特性教程"系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章"遍历.过滤.处理集合及使用Lambda表达式增强方法"中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组

link下多集合监视和事件通知机制是靠什么完成的?

问题描述 link下多集合监视和事件通知机制是靠什么完成的? link下多集合监视和事件通知机制是靠什么完成的? 解决方案 引起集合变动的无非就是add remove等几个方法, 在里面插入代码,引起changed事件就可以实现了

聚合数据-关于在聚合平台申请的key

问题描述 关于在聚合平台申请的key 我的问题是这样的,我现在在聚合平台申请了一个 key,那么当我在访问接口的时候,发送key值 ,怎么保证key的安全呢? 解决方案 聚合平台的请求接口中是直接把key作为参数的,并没有进行加密处理没,所以key值得安全性在请求时只能写申请得到的key.

java-Java管理系统,为什么TreeSet集合的全部元素添加不到另一个TreeSet集合里面?

问题描述 Java管理系统,为什么TreeSet集合的全部元素添加不到另一个TreeSet集合里面? // trees.addAll(tree);就是这里,这里添加不了另一个集合的全部元素,求解,谢谢了 //查看图书的功能 public void cheekBook(MyCompartor cm){ TreeSet<Book> trees=new TreeSet<Book>(cm); trees.addAll(tree); if(trees.isEmpty()){ System.o

集合转换-如何把这个set转换程list集合 并且按照要求排序啊

问题描述 如何把这个set转换程list集合 并且按照要求排序啊 用hibernate时 实体用set集合来关联的时候 如何把这个set转换程list集合 并且按照要求排序啊.就比如:Student 有teacher属性, 在查出student的时候,teacher是set集合,怎样把他转换成list集合,同时可以按照要求排序(如:teacher有age属性,按age大小排序) 解决方案 Java 集合转换(数组.List.Set.Map相互转换)Java 集合转换(数组.List.Set.Ma