可伸缩性最佳实战(转)

come form: http://www.jdon.com/37793

异步

同步调用使得组件和组件之间紧密耦合起来,这样就使得要想伸缩应用就需要伸缩所有的组件,这不仅带来使得伸缩的成本增加,而且这种高度耦合性使得伸缩变得更加困难。

因此我们需要从应用角度划分出,哪些业务操作是紧密关联的,哪些是可以异步执行的,划分出那些可以异步执行的操作,然后将其进行异步化处理(比如通过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://akfpartners.com/techblog/2009/08/11/scalability-best-practices/

时间: 2024-10-23 05:31:15

可伸缩性最佳实战(转)的相关文章

MySQL 5.7--------SSL连接最佳实战

                                                                                         MySQL 5.7--------SSL连接最佳实战 1. 背景 * 在生产环境下,安全总是无法忽视的问题,数据库安全则是重中之重,因为所有的数据都存放在数据库中 * 当使用非加密方式连接MySQL数据库时,在网络中传输的所有信息都是明文的,可以被网络中所有人截取,敏感信息可能被泄露.在传送敏感信息(如密码)时,可以采用

vue2 入门 教程 单页应用最佳实战[*****]

推荐 vue2 入门 教程 -------- 看过其他的,再看作者的,很赞 vue2 入门 教程 单页应用最佳实战 :  具体在 https://github.com/MeCKodo/vue-tutorial ----------------------------- 通过本文,我们可以学习到许多关于vue的特性. 1.了解了vue-cli脚手架 2.初步对webpack有了一些了解和认识 3.如何用.vue愉快的开发 4.使用vuex进行组件通信 5.路由(子路由)的应用 6.使用 vue-d

日志最佳实战

日志最佳实战 1. logback 2. 开发debug,生产info , 异常中用error 3. 使用self4j的占位符方式输入日志.多个参数输出,参数项使用数组的形式.举例 : logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol); 此种形式在确定日志输出级别前,不会拼接字符串. // LOGGER.isDebugEnabled() 4. 访问日志和错误日志记录到不同的文件中,方便查询

DataWorks调度配置最佳实战

摘要: DataWorks基于MaxCompute作为核心的计算.存储引擎,提供了海量数据的离线加工分析.数据挖掘的能力.通过DataWorks,可对数据进行数据传输.数据转换等相关操作,从不同的数据存储引入数据,对数据进行转化处理,最后将数据提取到其他数据系统. 摘要:DataWorks基于MaxCompute作为核心的计算.存储引擎,提供了海量数据的离线加工分析.数据挖掘的能力.通过DataWorks,可对数据进行数据传输.数据转换等相关操作,从不同的数据存储引入数据,对数据进行转化处理,最

MySQL--------基于binlog实现闪回最佳实战

1. 背景 * 为了数据安全,搭建了主从.实时主从备份只能防止硬件问题,比如主库的硬盘损坏.但对于误操作,则无能为力.比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新.当操作被同步到从库上后,则主从都"回天无力". * 闪回用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带where条件的update.delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复

Webpack之“多页面开发”最佳实战

前言:相信之前看过这篇文章,前端构建工具之“Webpack”的朋友,对于Webpack有了一定的了解.那么今天就跟大家分享下:如何利用webpack,来进行多页面项目实战开发. 一.项目初始化安装 1.先安装node.js 和 webpack 第一步:如果没有安装node的朋友,可以去node中文官网下载.安装好后,打开cmd工具,输入: 1  node - v // 如果有显示内容则证明安装成功(这是看我们node版本的指令) 如下图: 第二步: 全局安装webpack 1  npm  ins

异常处理最佳实战

1. 只在必要使用异常的地方才使用异常,不要用异常去控制程序的流程..慎地使用异常,异常捕获的代价非常高昂,异常使用过多会严重影响程序的性能. 2. 切忌使用空catch块.千万不要使用空的catch块,空的catch块意味着你在程序中隐藏了错误和异常,并且很可能导致程序出现不可控的执行结果.如果你非常肯定捕获到的异常 不会以任何方式对程序造成影响,最好用Log日志将该异常进行记录,以便日后方便更新和维护. 3. 异常信息放到一个单独的文件中 4. 在finally中释放资源 5. 如果客户端可

Docker--------docker-compose编排最佳实战

1. 背景 Docker Compose是一个用来定义和运行复杂应用的Docker工具.使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作. Docker Compose使用yml文件格式定义描述. 2. 安装方式 * 离线安装 下载可执行文件至执行目录 [[email protected] ~]# curl -L https://github.com/docker/compose/releases/download/1.14.0-rc2/

[svc]influxdb最佳实战-监控对比

最近在搞容器的监控,遇到influxdb这个库,搞了两天,些许明白了些套路,做个记录,备忘.... 小结如下: influxdb go语言编写 默认情况influxdb创建的库关联autogen的RP(存储策略),即数据会保留永久 监控和日志的区别 最近搞监控,所谓监控就是监控服务肉体是否健康(还活着/生病? 各项指标是否正常?) 区分日志搜集: 分析服务的精神状态是健康(服务的一个履历/日记) 如何做一个监控 参考: https://segmentfault.com/a/11900000110