在构建线性可收缩应用时,需要新的模式和中间件架构吗?GigaSpaces的CTO,Nati
Shalom认为,现有中间件是为以分层为基础的方法而设计的,它们不适合真正的线性可伸缩架构。他提出了新的基于自给自足处理单元的中间件栈(middleware
stack)作为替代,它支持分区/向外扩展(scale-out)模型。虽然Shalom提出了一个新的中间件栈,但是几年前,微软的Pat
Helland就提出了某种事务性模式及形式描述,它们可被用在被他称为准无限可伸缩的系统中。
Nati
Shalom声称
分层方法(消息传递、数据和业务处理)是一个死胡同,因为在每一层中和层与层之间,它引入了很多状态和“往返的消息”,这样做的目的仅仅是为了保持共享数据的同步。他指出分层方法注定提供非线性可伸缩性,为了使吞吐量线性增加,就必须按指数增加新CPU数目。
Nati提出了一种不同的替代架构方法,该方法中,这些分层被一起放入一个处理单元,确保消息传递、数据和处理发生在相同地址空间内。结合处理单元间的无共享架构(share-nothing
architecture)
,当处理需要增加时,只需增加机器即可,这样它就给出了一个线性可伸缩解决方案。这个模型显然非常适合无状态应用,但是对于有状态应用,事情变得有些复杂。之前,Nati曾提及如何伸缩一个有状态应用
。他通过2个基本规则:
- 你需要减少相同数据源上的连接。
- 你需要移除你的应用中不同单元间的依赖。只有每个工作单元是自给自足,同时不和其它单元共享任何东西,你才能获得线性可伸缩性。
这些是可伸缩性的基本原则。在有状态环境中,要实现这两个原则的一般模式是使用分区,即,将你的应用拆成不同的工作单元,每个单元处理你应用数据特定的子集。接下来,你就可以简单地通过增加更多的处理单元获得伸缩性。
如果数据可被划分成分离的应用数据子集,那么一个应用可以被向外扩展成许多独立的处理单元,其中每个单元拥有子集所需的全部数据。可用这种方法划分的典型数据的例子是Web应用的会话信息。然而,当很多应用进程需要访问/更新相同的共享数据时,这种分区模型不起作用。
Shalom说:“在这种情况下,数据可以通过远程分区被引用,即业务逻辑和消息传递将位于一个处理单元中,而数据在一个远程分区中——以这种方式,你仍然可以获得可伸缩性,虽然它有些滞后。”
但是,要是共享数据的容量巨大该怎么办?一种解决方案是,将同类数据分区进入不同的数据存储分区,但是这种解决方案需要解决两个主要问题:
- 聚合。在非集中的数据存储上如何执行查询?(即跨越一个很多数据存储分区的查询)
- 使用原子事务 VS 不使用原子事务。分布式事务可伸缩性不太好,因此需要其它的解决方案。
对于聚合问题,Shalom给出了解决方案:
你可以将查询并行化,这样每个查询针对不同的分区运行。这样做,你利用了每个分区内的CPU和内存能力,使你的请求被真正并行处理。注意,发起查询的客户端获得了被聚合的结果,而不知道分区是物理分离的,仿佛它基于单个的巨大数据存储运行,同时还有一个主要区别——它更快!
为了找出原子事务问题的解决方案,我们求助于Pat Helland,他已在一篇论文(“超越分布式事务的生命:一个变节者的意见
”)中着手解决这个问题,该文作于他在Amazon.com工作期间。在文中,他总结:在大的伸缩性系统中,人们基本上不应该使用跨系统事务。
对于在构建可收缩系统中被使用的概念和抽象,缺乏广为人知的术语。作为对此的回应,Helland定义:
- 实体(Entities)
是指定(键控)数据的集合,这些数据在实体内会被自动更新,但是更新从不跨实体发生。
- 活动(Activities)
由实体内的状态集合组成,被用来管理与单独搭档实体的消息传递关系。
得出决定的工作流,正如已被讨论了多年一样,功能在活动中,活动在实体中。当人们在查看准无限伸缩性时,令人惊讶的发现,它具有工作流细粒度的天性。
通过这个定义,Helland指出在相同的事务中不能更新两个实体。作为替代,他采用了“事务可串行性的多重分离范围”,后来,在论文中他将这个范围定义为实体。在此定义下,一次多个实体的更新不能在单个原子事务中被执行,而必须通过跨实体的消息传递,以实体间P2P(Peer-to-Peer)的风格完成。这种消息传递引入了自身管理会话状态的需要,并且Helland将这种用于每个实体搭档的状态管理定义为活动。他给出了一个例子:
考虑处理一个订单,它包含许多要采购的项目。为每个单独项目的出货预留库存将是一个单独的活动。订单有一个实体,每个被仓库管理的项目有单独的实体。事务不能跨越这些实体被采用。
在订单内,每个库存项被单独管理。消息传递协议必须被单独管理。包含在订单实体中的每个库存项目数据是一个活动。尽管它不是这样被命名的,但是这个模式频繁出现在大规模应用中。
由于这种方法引入的实体和消息传递之间缺乏事务的原子性,它引起了新的问题,对业务逻辑完全隐藏了其踪迹;消息重试和处理必须能处理幂等性。对等实体间也需要异步消息传递——细粒度工作流的对等强制实现——包括取消/确认操作随后的试探性操作。
Nati Shalom所期望的架构已在GigaSpaces平台
中被实现,它最近将发布版本6。Pat
Helland的论文是永恒的,绝对值得细细品味。
查看英文原文:
New patterns and
middleware architecture needed for true linear scalability?
原文:http://www.infoq.com/cn/news/2007/08/scalability-patterns
分享到:
相关推荐
《金融分布式中间件架构设计》 随着金融行业的快速发展和互联网技术的不断革新,传统的...只有充分理解和掌握分布式技术的原理与实践,才能成功地构建出适应新金融模式的中间件架构,推动金融行业的持续创新和发展。
### 软件工程与软件系统可伸缩性评估 #### 第一章:软件工程概述 ...通过对软件架构进行合理设计,并采取有效的可伸缩性策略和技术,可以显著提升系统的性能和稳定性,从而更好地应对不断变化的业务需求和技术挑战。
本文档总结了企业技术架构评审的要点,涵盖了组件选型、性能、可伸缩性、灵活性、可靠性、安全性、兼容性、弹性处理和事务性九个方面的重要评估要点。 组件选型: * 是否选择了非开源的组件? * 是否选择了Erlang...
线性判别函数,模式识别的
线性分类器在模式识别中扮演着至关重要的角色,它是一种简单而强大的工具,尤其适用于数据分布具有线性边界的场景。在这个主题中,我们将深入探讨线性分类器的理论基础,以及如何在MATLAB环境中进行实现。我们将重点...
在处理海量数据和高并发访问时,传统的单体数据库往往力不从心,这时就需要引入分布式数据库和相应的中间件来提升系统的扩展性和可用性。 分布式数据库是指将数据分散存储在多个物理节点上,通过一定的算法实现数据...
【模式识别实验报告——基于Fisher准则的线性分类器设计】 在模式识别领域,设计有效的分类器是一项关键任务。本实验报告主要关注基于Fisher准则的线性分类器,这是一种经典而实用的方法,尤其在高维数据处理中。...
线性判别ldf模式识别
阿里云的中间件产品通过不断演进和技术创新,将阿里巴巴在互联网架构领域的经验转化为可复用的解决方案,帮助企业快速响应业务变化,实现数据标准化、实时化,同时确保服务的线性扩展和高可用性。无论是传统的业务...
采用最小平方误差判别(MSE),对线性可分数据集和非线性可分数据集进行分类。通过实验观察不同参数取值分类结果的差异性。 在线性不可分的情况下,不等式组不可能同时满足。一种直观的想法就是,希望求一个α*使被...
在模式识别中,我们需要使用线性代数和概率统计来设计和实现模式识别算法和模型。例如,在图像识别中,我们可以使用矩阵来表示图像,然后使用矩阵操作来实现图像的特征提取和分类。在语音识别中,我们可以使用概率...
本篇文章将对一些主流的Redis Java客户端进行对比分析,探讨它们在分布式和线性可伸缩性方面的表现。 1. Jedis Jedis是最常见的Redis Java客户端,它简单易用,支持所有Redis命令,并且有着广泛的社区支持。然而,...
模式识别的经典算法之一,线性判别算法,也叫最大最小距离法~
### 模式线性可分时的一种单层感知器算法 #### 引言 在模式识别领域中,模式分类是一项核心任务。对于线性可分的模式,即可以通过一条或多条直线(在二维空间)或超平面(在高维空间)将不同类别的样本分开的情况,...
信息架构模式的应用不仅可以使网站更加用户友好,还能促进搜索引擎优化(SEO),提高网站的可发现性和可访问性。 总之,《信息架构的模式》提供了一个宝贵的资源库,帮助设计师和开发者更好地理解和实施有效的信息...
这里以OTUs对环境因子pH的响应作为例子,pH在很多生态系统中都被证明是影响群落结构的主要影响因子,OTUs对环境因子如pH的相应有两种模式——线性相应和单峰响应。线性响应是指OTU随研究范围内pH的增加单调地增加或...
线性稳压器和开关模式电源(SMPS)是电源设计领域的两种基本电源管理技术,广泛应用于电子系统中以提供稳定的电压和电流输出。这两种技术各有其工作原理、优点、缺点以及设计考虑因素。 首先,我们来看线性稳压器。...
模式识别 线性判别函数 分类器 机器学习 课件