这一篇是可伸缩性的最佳实践,我自己也说了说自己的理解。
异步
同步调用使得组件和组件之间紧密耦合起来,这样就使得要想伸缩应用就需要伸缩所有的组件,这不仅带来使得伸缩的成本增加,而且这种高度耦合性使得伸缩变得更加困难。因此我们需要从应用角度划分出,哪些业务操作是紧密关联的,哪些是可以异步执行的,划分出那些可以异步执行的操作,然后将其进行异步化处理(比如通过JMS,事件队列,多播消息等或者线程池等),这样划分的好处就是系统可以应对更大的访问量,消弱访问峰值,比如在同步的时候A调用了B,那么用户能接受响应时间就是A处理时间+B处理的时间,而采用异步以后,当访问量增大的时候,因为A和B异步,那么A很快返回,用户体会不到延迟,而B的处理时间由原来的2秒处理完毕,变为3秒处理完毕,而B得处理都是在后台进行的,不会影响到客户响应事件,同时异步也起到了消弱峰值的作用。
其实在社会生活中也存在很多异步的场景,比如老板和秘书,假如老板没有秘书,那么势必老板在处理完事情A之前没有办法处理新的事务,而有了秘书以后,有什么次要的事情让秘书去办,同时老板可以做其它的重要的事情O(∩_∩)。
因此异步不仅利用底层框架平台的异步性,更重要的是如何做到应用本身的异步性,只有做到了这一点才算是真正的异步。
泳道设计
通过泳道(非常形象的比喻)将错误进行隔离,使得不同的错误域的错误不会相互干扰,这样也就不会因为系统某一部分的错误影响到系统的其它的部分。
缓存
在系统多个层使用缓存,比如在数据库前面的Model缓存,页面,页面片段缓存等。
监控
我们应该站在真正用户的角度去理解系统的性能,包括从外部网络测试用户体验以及内部系统的各个组件调用的次数以及每次调用的时间等等。
复制
数据库读写库分离,这样不仅可以做到一定的容灾,而且可以通过读写分离来减低写数据库的压力。
切分
没有切分就没有伸缩性,因此一个具有良好伸缩性的系统必须进行切分,而切分可以从两个地方入手,首先应用角度来说,可以将系统在垂直方向上面分层(这是一种系统架构级的粗粒度的切分),同时将系统的每个层按照功能或者资源进行水平的切分(这是一种相对细粒度的应用级的切分)。
其次对于数据的切分,比如将用户信息,交易信息,商品信息等独立存储,数据库的切分主要有读写库分离以及Sharding技术。
尽量少用关系数据库特性
系统使用关系数据库的特性越多,那么伸缩性就会变得越差,这就要求将应用逻辑从数据库真正的移动到应用中来,数据库仅仅是一种存储的技术手段,而不是应用逻辑运算的地方。
我想这一点大家应该比较清楚,如果将业务逻辑用存储过程实现,那么就会造成非常差的伸缩性,但是我想说的是及时不用关系数据库的特性,如果我们不能从应用的角度去设计系统,照样会造成很差的伸缩性。比如目前普遍采用的SSH,其实说白了这还是一种面向过程的开发,每次业务操作都是从Dao获取数据,然后Service改变一些数据,最终调用Dao保存数据,这种方式还是一种没有伸缩性的方案。
那么什么样的方式比较具有伸缩性,我个人认为通过领域建模和分布式缓存,通过对象建模形成业务对新,业务对象以聚合的方式存在缓存中(当然随着KEY-VALUE的不断流行,我们可以直接将聚合跟存放在KEY-VALUE存储系统中),每次业务操作都是存缓存中取出业务对象,调用业务对象进行业务操作,操作的过程中,业务对象会触发领域事件,然后最终领域事件监听器调用技术组件完成一些附加操作,采用这种方式,我们还可以采用异步的领域事件,这就使得系统的并发通过JAVA本身的内存锁机制实现,而不是靠原来的数据库的事务隔离性来保证并发安全性。
压力和性能测试
在系统发布前进行压力和性能测试,尽管不会发现所有隐藏的问题,但是它也是非常值得的。
容量规划以及伸缩性探讨会
我们要清楚的认识到当前系统能支持的负载,以及系统中可能存在的性能和伸缩性的瓶颈在哪里,在解决了某一个伸缩性的瓶颈以后,我们就需要关注下一个随着系统不断增加可能带来伸缩性瓶颈的问题。
回滚
任何操作都有可能失败,因此我们的系统一定要做好回滚操作,这个回滚操作室广义的回滚,具体可参考“可伸缩性和可用性反模式”。
根源分析
确保能在发生问题的时候找到问题的根源,做到治标治本。
关注系统质量
应该在系统开始的时候就关注系统质量,而不是在测试阶段出现问题的时候才考虑如何伸缩,那个时候就晚了。
原文:
http://akfpartners.com/techblog/2009/08/11/scalability-best-practices/
<!--EndFragment-->
分享到:
相关推荐
可伸缩性最佳实践:来自eBay的经验
本文将深入探讨MySQL与Oracle在性能、可伸缩性以及最佳实践方面的比较,并通过代码示例来展示它们在实际应用中的表现。 MySQL和Oracle在性能和可伸缩性方面各有优势。Oracle适合大型企业和数据密集型应用,而MySQL...
2. **可伸缩性最佳实践**:这部分内容会讨论如何设计和实施能够处理高并发和大数据量的系统。这可能包括负载均衡、缓存策略、水平扩展、数据库优化等策略,旨在确保系统的高效运行和扩展能力。 3. **使用负载均衡...
【标题】:eBay架构——可伸缩性最佳实践 【描述】:eBay作为全球最大的电子商务平台,其架构设计对于可伸缩性有着至关重要的要求。本文分享了eBay在应对海量用户和数据压力时所采取的可伸缩性策略。 【标签】:...
### 开发者最佳实践日——高可用和可伸缩架构详解 #### 一、高可用的概念与实现 ##### 1.1 高可用定义 在IT领域,“高可用”(High Availability, HA)通常指的是系统在面对单点故障时能够维持正常运行的能力。...
- **可伸缩性**:通过添加更多节点,可以增加处理能力,适应工作负载的增长。 3. **规划最佳实践**: - **消除SPOF**:确保包括网络、存储和操作系统在内的所有组件都有冗余。 - **负载均衡**:利用Net服务和...
这种架构风格在近年来得到了广泛的关注和采纳,因为其能够提高系统的可伸缩性、灵活性和可维护性。 微服务架构的发展历程可以追溯到2011年,当时的理念是将服务设计得更小巧、专注,以此提升系统的可管理性。James ...
**VB.NET可伸缩性技术手册(PDG)** 在软件开发中,可伸缩性(Scalability)是一项至关重要的特性,它关乎程序在面对负载增加、数据增长或用户需求变化时,能否有效地扩展和适应。VB.NET作为.NET框架的一部分,提供了...
这些部分不仅提供了云计算的理论知识,还提供了实际操作的指导,帮助开发者和架构师实现高可用、灵活、可伸缩的云计算环境。 文档中提到的“IT资产作为配置的资源”是云计算中的一个重要概念,意味着资源可以按需...
Oracle真正应用集群(RAC,Real Application Clusters)是一种高可用性和可伸缩性的数据库解决方案,它允许多个服务器节点共享同一数据库实例,从而提供无中断的服务和性能增强。RAC的最佳实践旨在优化集群的性能、...
该主题涵盖了eBay成长过程中架构和实施方面的最佳实践,以及如何在24×7x365环境下使其基础架构平稳地具有可伸缩性特征。它囊括了几乎所有大规模系统必备的特性,比如可扩展性、可用性和可管理性等。 具体而言,...
首先,从标题“基于 TiDB 与 Flink 的实时数仓最佳实践的白皮书.pdf”来看,该白皮书主要涉及的知识点应包括TiDB与Flink的使用,以及它们在构建实时数据仓库方面的最佳实践。 TiDB是一款开源的分布式关系型数据库,...
本文为您提供了在 Microsoft ADO.NET 应用程序中实现和获得最佳性能、可伸缩性以及功能的最佳解决方案;同时也讲述了使用 ADO.NET 中可用对象的最佳实践;并提出一些有助于优化 ADO.NET 应用程序设计的建议。 本文...
- **应用架构调优**:优化数据访问层、缓存机制、异步处理等,采用微服务架构可提高系统的可伸缩性和可维护性。 #### 五、调优过程中的注意事项 在进行调优过程中,需要注意以下几点: - 在没有明确且共同认可的...
第7条 编程中应知道何时和如何考虑可伸缩性 14 第8条 不要进行不成熟的优化 16 第9条 不要进行不成熟的劣化 18 第10条 尽量减少全局和共享数据 19 第11条 隐藏信息 20 第12条 懂得何时和如何进行...
ASP.NET是微软公司推出的Web应用程序框架,用于构建高性能、安全且可伸缩的网站和Web应用程序。对于初学者来说,掌握ASP.NET的关键概念和技术是非常重要的。以下是对标题和描述中涉及的五个实践的详细说明: **实践...
4. **可伸缩性**:可伸缩性是指菜单可以根据用户的操作动态地展开或折叠。这种特性使得用户可以快速隐藏不相关的部分,聚焦于当前需要的信息,同时在需要时轻松访问更多选项。 5. **实现技术**:在前端开发中,可以...