稳定高并发高性能程序设计原则简单总结

引言mysql

高并发常常会发生在有大活跃用户量,用户高汇集的业务场景中,如:秒杀活动,定时领取红包等。面试

为了让业务能够流畅的运行而且给用户一个好的交互体验,咱们须要根据业务场景预估达到的并发量等因素,来设计适合本身业务场景的高并发处理方案。redis

在工做这些年里,我有幸遇到了高并发各类坑,对如何设计高性能接口有一些经验,其实无外乎知足如下几个特色:算法

灵敏性 伸缩性 容错性 事件驱动/消息驱动 高性能接口设计准则sql

在引言里我也说了高性能设计的四个准则,如今具体对这四个准则作一些描述;数据库

  1. 灵敏性

应用程序应该尽量快的对请求作出响应。编程

若是能够在顺序获取数据和并行获取数据之间进行选择的话,为了尽快向用户返回响应,始终应该优先选择并行获取数据,能够同时请求互相没有关联的数据。当咱们须要请求多个互相无关,没有依赖的数据的时候,应该考虑是否可以同时请求这些数据。缓存

若是可能出现错误,应该当即返回,将问题通知用户,不要让用户等待直到超时。服务器

1.1 如何设计灵敏性数据结构

缓存前置

对于一些改变不频繁的数据,应该放在分布式缓存中,例如redis,若是是一些元数据(例如,一些计数器的配置信息,变量的配置信息等)则应该启用本地缓存,简单流程以下:

如何设计高性能的接口 若是一些热点数据不大的话,建议服务启动的时候就应该提早加载到缓存中,这样能够提升服务的性能。

读写拆分部署

若是你的服务既涉及到读操做,也涉及到写操做, 应该将读写隔离部署,这样读服务的压力不会影响到写服务,写服务的压力不会影响到读服务。流程以下:

如何设计高性能的接口 固然除了按照读写进行拆分部署外,还能够按照业务进行隔离部署。

对等设计、无状态

所谓无状态是指应用服务器不保存业务的上下文信息,而仅根据每次请求提交的数据进行相应的业务逻辑处理,多个服务实例(服务器)之间彻底对等,请求提交到任意服务器,处理结果是彻底同样的。

不保存状态的应用给高可用的架构设计带来了巨大便利,既然服务器不保存请求的状态,那么全部的服务器彻底对等,当任意一台或多台服务器宕机,请求提交给集群中的其余任意一台可用机器处理,这样对终端用户而言,请求老是可以成功的,整个系统依然可用。对于应用服务器集群,实现这种服务器可用状态实时检测、自动转移失败任务的机制就是负载均衡。

如何设计高性能的接口 DB分库分表,读写分离

对于数据层来讲,若是数据量不大,db能够采用读写分离部署,对于读多写少的场景能够解决一部分压力,从而提升咱们接口的响应速度,若是写的数据量和读的数据量都很大,那么就必需要对db进行分库分表外加读写分离了。

如何设计高性能的接口 2. 伸缩性

应用程序应该可以根据不一样的工做负载进行伸缩扩展(尤为是经过增长计算资源来进行扩展)。为了提供伸缩性,系统应该努力消除瓶颈。

若是在虚拟机上运行内存数据库,那么添加另外一个虚拟几点就能够将全部的查询请求分布到两台虚拟服务器上,将可能的吞吐量增长至原来的两倍。添加额外的节点应该可以几乎线性的提升系统的性能。

增长一个内存数据库的节点后,还能够将数据分为两半,并将其中的一半移至新的节点,这样就可以将内存容量提升至原来的两倍。添加节点应该可以几乎线性的提升内存容量。

因此通常好的接口设计是能够经过水平扩展机器来达到提高性能的,这就要求咱们设计接口的时候提现无状态性。

  1. 容错性

应用程序应该考虑到错误发生的状况,而且从容的对错误状况作出响应。若是系统的某个组件发生错误,对与该组件无关的请求不该该产生任务影响。错误是难以免的,所以应该将错误形成的影响限制在发生错误的组件以内。若是可能的话,经过对重要组件及数据的备份和冗余,这些组件发生错误时不该该对其外部行为有任何影响。

稳定性

稳定性是第一前提,如系统崩溃恢复容灾备份这些,主要是一些数据保护的机制,还有就是程序参数的校验、异常的处理、事务的回滚、程序边界的设计(合理的边界划分能够避免服务的连锁崩溃)、对帐机制等,这些都是平常生活中经常使用的一些手段在计算机领域的体现,更详细的设计就不深刻的分析了。

高并发

经过多年来对操做系统的研究,以及结合多年来各类语言的编程经验来讲,高性能的程序的开发其实都是有规可循的。由于高性能的程序基本上都会面临类似的问题:如何提升并发,如何下降时间复杂度(可是并非一味的下降,须要在空间复杂度之间作一个平衡)。

如何提升并发:在目前的大多数程序中或多或少的都会遇到并发的问题,如何设计高效的并发很是的重要,从我我的的经验来讲,当遇到一个会存在并发的业务场景,我会首先整理业务场景,并根据业务场景画出简单的数据流图,根据数据流图找出相应的会并发访问修改的数据,缩小加锁的粒度(只对须要并发访问的数据进行加锁),。

而后分析数据的性质是否能够局部的并发,这种状况下就可使用分段锁(再次减少加锁的粒度,一个比较出名的例子就是mysql的表锁、行锁机制)。

最后再分析数据的访问性质,是读多写少(大部分都是这种状况)、读少写多(日志)、仍是读写频率差很少,不一样的业务状况使用不一样的锁,好比针对读多写少的业务来讲,为了提升读的并发性可使用读写锁;针对并发粒度较小,且并发操做的耗时很短的状况,操做系统又提出了CAS操做(乐观锁),这种操做避免了上锁和释放锁耗时的过程,进一步提升了并发性,可是只是针对特定的场景才能达到想要的性能。

当单台并发达到上限以后,就是分布式系统粉墨登场了,虽然分布式系统数据一致性会有必定的耗时,可是分布式系统的并发却有了显著的提升,一致性所带来的耗时/并发数带来的平均延迟并不大,因此能很好的知足系统的需求。

高性能

高性能的设计主要分为两个层面,一个层面是操做系统层面的,另一个层面是业务层。

操做系统层面:尽可能使用操做系统和处理器自身的高性能的指令或者是运算方式,最简单的例子是位运算,针对一些特殊的算法若是能使用位运算实现,那么尽可能使用位运算实现(这在不少算法面试题中都会考的,由于位运算在不少场景都有特别切合实际的使用),还有就是合理高效的使用操做系统自身的API,如DMA之类的机制,以及有效的利用缓存之类的机制。

业务层面来讲:首先须要为数据的存储设计合适的数据结构,这个也须要在空间利用率和访问复杂度之间作权衡;而后为业务中须要计算的场景设计高效的算法,算法的抽象是一个比较难的事情,算法设计须要在时间复杂度和空间复杂度中作权衡,还有就是针对算法的特性进行优化,能够参考算法设计,若是算法具备分治、动态规划这些算法的特性,那么此类算法能够采用并发机制提升算法的性能(算法设计很复杂,算法自己涉及到的不少高等数学的知识,还有就是算法的实现是否更加符合计算机的运行机制,建议多看看ACM算法设计相关书籍)若是想学习Java工程化、高性能及分布式、深刻浅出。性能调优、Spring,MyBatis,Netty源码分析的朋友能够加个人Java高级架构进阶群:180705916,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给你们

相关文章
相关标签/搜索