异步
同步调用使得组件和组件之间紧密耦合起来,这样就使得要想伸缩应用就需要伸缩所有的组件,这不仅带来使得伸缩的成本增加,而且这种高度耦合性使得伸缩变得更加困难。因此我们需要从应用角度划分出,哪些业务操作是紧密关联的,哪些是可以异步
执行的,划分出那些可以异步
执行的操作,然后将其进行异步
化处理(比如通过JMS,事件队列,多播消息等或者线程池等),这样划分的好处就是系统可以应对更大的访问量,消弱访问峰值,比如在同步的时候A调用了B,那么用户能接受响应时间就是A处理时间+B处理的时间,而采用异步
以后,当访问量增大的时候,因为A和B异步,那么A很快返回,用户体会不到延迟,而B的处理时间由原来的2秒处理完毕,变为3秒处理完毕,而B得处理都是在后台进行的,不会影响到客户响应事件,同时异步
也起到了消弱峰值的作用。
其实在社会生活中也存在很多异步
的场景,比如老板和秘书,假如老板没有秘书,那么势必老板在处理完事情A之前没有办法处理新的事务
,而有了秘书以后,有什么次要的事情让秘书去办,同时老板可以做其它的重要的事情O(∩_∩)。
因此异步
不仅利用底层框架平台的异步
性,更重要的是如何做到应用本身的异步
性,只有做到了这一点才算是真正的异步
。
泳道设计
通过泳道(非常形象的比喻)将错误进行隔离,使得不同的错误域的错误不会相互干扰,这样也就不会因为系统某一部分的错误影响到系统的其它的部分。
缓存
在系统多个层使用缓存
,比如在数据库前面的Model缓存,页面,页面片段缓存
等。至于对象缓存
,jdon已经讨论太对了呵呵。
监控
我们应该站在真正用户的角度去理解系统的性能,包括从外部网络测试用户体验以及内部系统的各个组件调用的次数以及每次调用的时间等等。
复制
数据库读写库分离,这样不仅可以做到一定的容灾,而且可以通过读写分离来减低写数据库的压力。
切分
没有切分就没有伸缩性
,因此一个具有良好伸缩性
的系统必须进行切分,而切分可以从两个地方入手,首先应用角度来说,可以将系统在垂直方向上面分层(这是一种系统架构级的粗粒度的切分),同时将系统的每个层按照功能或者资源进行水平的切分(这是一种相对细粒度的应用级的切分)。
其次对于数据的切分,比如将用户信息,交易信息,商品信息等独立存储,数据库的切分主要有读写库分离以及Sharding技术。
尽量少用关系数据库特性
系统使用关系数据库的特性越多,那么伸缩性
就会变得越差,这就要求将应用逻辑从数据库真正的移动到应用中来,数据库仅仅是一种存储的技术手段,而不是应用逻辑运算的地方。
我想这一点大家应该比较清楚,如果将业务逻辑用存储过程实现,那么就会造成非常差的伸缩性
,但是我想说的是及时不用关系数据库的特性,如果我们不能从应用的角度去设计系统,照样会造成很差的伸缩性
。比如目前普遍采用的SSH,其实说白了这还是一种面向过程的开发,每次业务操作都是从Dao获取数据,然后Service改变一些数据,最终调用Dao保存数据,这种方式还是一种没有伸缩性
的方案。
那么什么样的方式比较具有伸缩性
,我个人认为通过领域建模和分布式缓存
,通过对象建模形成业务对新,业务对象以聚合的方式存在缓存
中(当然随着KEY-VALUE的不断流行,我们可以直接将聚合跟存放在KEY-VALUE存储系统中),每次业务操作都是存缓存
中取出业务对象,调用业务对象进行业务操作,操作的过程中,业务对象会触发领域事件,然后最终领域事件监听器调用技术组件完成一些附加操作,采用这种方式,我们还可以采用异步
的领域事件,这就使得系统的并发通过JAVA本身的内存锁机制实现,而不是靠原来的数据库的事务
隔离性来保证并发安全性。
压力和性能测试
在系统发布前进行压力和性能测试,尽管不会发现所有隐藏的问题,但是它也是非常值得的。
容量规划以及伸缩性
探讨会
我们要清楚的认识到当前系统能支持的负载,以及系统中可能存在的性能和伸缩性
的瓶颈在哪里,在解决了某一个伸缩性
的瓶颈以后,我们就需要关注下一个随着系统不断增加可能带来伸缩性
瓶颈的问题。
回滚
任何操作都有可能失败,因此我们的系统一定要做好回滚操作,这个回滚操作室广义的回滚,具体可参考“可伸缩性
和可用性反模式”。
根源分析
确保能在发生问题的时候找到问题的根源,做到治标治本。
关注系统质量
应该在系统开始的时候就关注系统质量,而不是在测试阶段出现问题的时候才考虑如何伸缩,那个时候就晚了。
原文:http://www.jdon.com/jivejdon/thread/37793#23126151
分享到:
相关推荐
《Enterprise SOA中文版:面向服务架构的最佳实战》是一本深度探讨Service-Oriented Architecture(SOA)的专著,旨在帮助企业实现灵活、可扩展且互操作性强的IT系统。SOA是一种设计和构建分布式软件系统的方法论,...
集群中的节点可以共享状态信息和分布式资源,增强了系统的可伸缩性和可用性。 持久化是Akka的一个重要组成部分,特别是当构建需要持久化消息或状态的分布式系统时。Akka提供了持久化模块,允许开发者在面对故障或...
第三部分聚焦于性能优化,讲解了如何避免活跃性问题(如死锁和活锁)以及如何提高并发代码的性能和可伸缩性。此外,还介绍了测试并发代码正确性和性能的实用技巧,这对于在生产环境中确保程序的稳定性和效率至关重要...
这种架构风格强调业务能力的解耦,提高系统的可伸缩性、可靠性和敏捷性。 在这个学习过程中,Spring Cloud是一个重要的组件。Spring Cloud是基于Spring Boot的微服务开发框架,它提供了一整套微服务解决方案,包括...
书中通过实例解释了诸如`ExecutorService`、`Future`、`Callable`、`BlockingQueue`等高级并发工具类的使用方法,并详细阐述了如何利用这些工具来构建可伸缩、高性能的应用系统。 #### 二、并发基础知识 本书不仅...
该书不仅介绍了并发编程的基本原理,还包括了各种并发工具的使用方法、常见的并发问题及其解决方案、以及如何优化并发应用程序的性能和可伸缩性。 在并发编程中,线程池是一种能够有效管理线程生命周期,提高线程...
这种架构风格提高了系统的可伸缩性、可维护性和可部署性。 在这个实战精讲中,我们可能会学习到以下核心知识点: 1. **容器化**:Docker是最常见的容器化工具,它允许我们将应用及其依赖打包成一个可移植的容器,...
这包括与利益相关者进行沟通,了解系统的目标、功能、性能指标以及非功能需求,如安全性、可用性、可伸缩性等。 2. **架构愿景**:在明确需求后,架构师需要形成一个架构愿景,即对系统整体结构的初步设想。这个...
4. 微服务架构:讨论如何在PaaS环境中实现微服务架构,以提高系统的可伸缩性和可维护性。 5. 数据管理与安全性:探讨在云端环境下如何确保数据的安全和合规,包括数据加密、备份恢复和访问控制等。 6. API管理和...
在实际开发中,应遵循最佳实践,如合理划分组件职责,避免过度设计,利用EJB的特性来提高系统的可伸缩性和可靠性。 通过这个实战录,开发者将能够深入了解EJB的各个方面,熟练运用EJB技术构建稳定、高效的大型企业...
OpenTSDB与HBase的结合使得它能够处理大规模的时间序列数据集,并且具有良好的可伸缩性。另一个例子是地理信息系统(GIS)的扩展,HBase可以用来处理地理空间数据,展示了其在大数据场景下的应用能力。 从书籍的...
1. **计算服务**:AWS的EC2(Elastic Compute Cloud)是其核心计算服务,提供可伸缩的虚拟服务器,称为实例。读者将学习如何选择合适的实例类型、配置自动扩展和使用弹性负载均衡器来提高应用性能和可用性。 2. **...
- **Java EE**(Java Platform, Enterprise Edition)是用于构建可伸缩且健壮的企业级应用程序的标准平台。它提供了丰富的API和服务,如**JSF**(JavaServer Faces)、**EJB**(Enterprise JavaBeans)等,支持开发...
大规模通常指的是系统能够处理海量的数据和用户请求,这就需要系统具备良好的可伸缩性,即在需求增长时,能够通过增加硬件资源来提升处理能力。分布式系统通过将工作负载分散到多个节点上,实现了这种水平扩展的能力...
2. **企业级应用**:通常指的是需要处理大量数据和业务逻辑,同时要求高可用性、安全性和可伸缩性的应用程序。企业级应用的开发往往要遵循一些特定的设计模式和最佳实践,例如分层架构、服务导向架构(SOA)以及...
5. **自动化运维**:探索自动伸缩(Horizontal Pod Autoscaler, HPA)和垂直伸缩(Vertical Pod Autoscaler, VPA),以及如何利用Kubernetes的自愈机制确保应用高可用性。 6. **监控与日志**:了解如何集成...
它以其灵活性、可伸缩性和高性能而受到广泛欢迎,尤其适用于处理大数据和实时应用程序。本资源包含两部分:《MongoDB权威指南(中文版)》和《MongoDB实战_电子书》,这两部PDF文档将帮助您深入理解和掌握MongoDB的...
- Istio在设计时充分考虑了性能和可伸缩性,能够支持大规模的服务部署。 #### 最佳实践 - **为服务网格选择入口网关**:Istio支持自定义入口网关,可以根据业务需求选择合适的网关实现。 - **服务网格全景图**:...
在大型分布式网站的架构设计中,首要考虑的是系统的可伸缩性、容错性和高可用性。这通常涉及到负载均衡、服务发现、数据分片、分布式缓存、数据库复制等多个方面。负载均衡技术用于在多台服务器间分配请求,确保单个...