全定制网站开发,安徽省建筑人员信息网,百度指数下载,wordpress 登录地址“灵魂拷问#xff1a;应对高并发系统有没有一些通用的解决方案呢#xff1f;这些方案解决了什么问题呢#xff1f;这些方案有那些优势和劣势呢#xff1f;对性能孜孜不倦的追求是互联网技术不断发展的根本驱动力#xff0c;从最初的大型机到现在的微型机#xff0c;在本… “灵魂拷问应对高并发系统有没有一些通用的解决方案呢这些方案解决了什么问题呢这些方案有那些优势和劣势呢对性能孜孜不倦的追求是互联网技术不断发展的根本驱动力从最初的大型机到现在的微型机在本质上也是为了性能而生。软件系统也存在类似的现象一个系统从最初的少量访问请求到后期的大并发请求这都需要我们对性能的提升提供一系列解决方案。像最初的淘宝也仅仅是一个外包做出来的产品随着业务的不断发展淘宝的并发量指数级增加同时对系统提出了严峻的挑战这才逐步造就了现在淘宝这样可以支撑数千万人同时在线的高并发系统。提起应对高并发每个人都或多或少可以说出几种解决方案高并发系统的设计魅力在于我们能够凭借程序员的聪明才智设计巧妙的方案从而应对巨大流量的冲击。从目前已知的方案中大体可以归纳为以下几种提升单机性能尽可能的提升单机的性能是一个永恒的话题无论是采用分布式还是其他方案单机性能的提高对于一个系统来说只有益处。拿编程语言来说c或者c语言编写的程序理论上会比java netPython写的程序要高效当然这需要建立在程序正常运行的情况下。提升单机性能最简单粗暴的方式就是提升硬件性能举一个简单例子假如数据库DB的服务器内存为8G随着数据量的增加你会发现有些sql执行会慢慢的变慢原因是数据库的索引或者数据在内存中完全存放不下需要回写磁盘有些查询在内存中并不能命中造成了一些sql会在磁盘中查询数据这个时候如果把服务器的内存增加到16G你会发现这些慢sql居然凭空消失了这是硬件提升性能的一个典型案例。对于运行的程序也是同样的道理尽可能的把程序优化到极致也许单机就可以达到别人分布式部署的性能效果当然这需要我们在编写代码的时候仔细构思。“无论什么时候我觉得提升单机性能都有必要横向扩展当一个单机系统无法抵抗巨大流量冲击的时候最简单有效的解决方案之一便是横向扩展横向扩展是指把巨大的流量分割为数个比较小的流量从而解决高并发系统的性能问题本质上横向扩展属于分而治之的理论属于分布式的概念范畴。举一个很简单的例子假设目前单机处理请求数为200/s当每秒的请求数到达1000的时候单台机器肯定会遇到瓶颈这个时候如果处理请求的服务器增加到5台甚至更多这样便轻松解决了性能问题。当然能否方便的横向扩展还要看具体的系统设计如果系统是无状态的理论上横向扩展是没问题的但是一些有状态的服务可能会涉及到状态的迁移等工作这也是为什么很多架构师提倡无状态服务的一个原因。一个应用程序的横向扩展可以通过负载均衡来实现像阿里云的SLB服务nginx的反向代理功能这些都可以很方便实现应用程序的横向扩展。但是像数据库比如mysql这样的DB系统无限制的横向扩展可能只是一个目标。大多数DB采用的主从或者多主多从来解决横向扩展问题主节点负责写操作从节点负责读操作当然这里涉及到主从同步的机制主从同步的延迟等问题有兴趣的同学可以去深入研究一下。image那什么时候该选择横向扩展呢一般来讲在系统的设计之初便会考虑横向扩展因为这种方案足够简单可以用堆砌硬件来解决的问题就不是问题。现在我敢说90%以上的系统在第一版上线的时候就做了类似负载均衡的部署方案其中有很多就利用了nginx的反向代理功能。image当然横向扩展并非没有负面影响和单机系统一样横向扩展也要考虑某个节点down掉的问题所以监控和健康检查是现在一个系统必备的手段而且在系统设计之初便会在整体架构之中。就像我前几篇的文章所说横向扩展既然属于分布式范畴必然需要考虑分布式系统需要考虑的问题分布式系统的问题缓存除了上面所说的横向扩展方案另外一种行之有效并且足够简单的便是缓存方案。这一点毋庸置疑缓存可以遍布在一个系统的各个角落从操作系统到浏览器从cpu到磁盘从数据库到消息队列任何稍微复杂的服务和组件中都有缓存的影子。缓存为什么可以大幅度提高性能的性能呢这还需要从系统的瓶颈来说在客户端一个请求的生命周期中这个请求的响应时间严重受限于最慢的那个环节这类似于木桶效应一个木桶可以存的水量取决于最短那个木板。举一个很简单的例子当客户端请求商城的一个商品信息的时候请求经过http协议到达服务器的某个端口服务端程序把请求解包然后去请求数据库数据库不单单在另外一台服务器上而且还需要从磁盘中加载数据所谓的DB缓存没有命中。在这整个过程中请求磁盘的过程是最慢的普通磁盘是由机械手臂磁头转轴盘片组成磁盘在查询数据的时候磁头是需要花费很长时间累寻道的当然SSD的速度要比普通磁盘快的多但是相比较内存还是要慢几个量级。而我们最想要的流程是这样的当一个请求到达服务端的时候能尽快的从某个设备上取出信息然后返给客户端这个设备绝不可能是磁盘这个设备在速度和容量上比较均衡它应该是内存。“缓存在语义上要丰富很多我们可以把任何可以降低响应时间的中间存储都称之为缓存。比如CPU的一级缓存二级缓存三级缓存浏览器的缓存等。缓存主要解决了上下游设备速度不匹配的问题image程序界有一句古话把数据放在离用户最近的地方才是最快的。CDN本质上就是做的这件事。对于缓存而言我们经常会听到浏览器缓存进程内缓存进程外缓存等概念。目前针对于服务端一般的缓存策略为采用第三方kv存储设备比如redisMemcache等。当然在对性能极其苛刻的系统中我还是推荐使用进程内缓存具体可见之前的推文高并发下为什么更喜欢进程内缓存异步谈到异步必须要说下同步同步调用是指调用方要阻塞等待被调用方执行完毕才可以返回。系统现在普遍都会采用多线程的方式来提供系统的吞吐量多进程的方式现在很少但不代表没有比如nodejsnginx在同步这种方式下如果被调用方的响应时间过长会造成调用方的线程长时间处于等待状态线程的利用率大幅度降低线程对于系统来说是很昂贵的资源创建大量的线程去应对高并发是不明智的不仅仅浪费了内存而且会加大线程上下文cpu切换的成本。一个高吞吐量的系统理论上所有的线程都要时时刻刻在工作而且把cpu资源压榨到最多。对于一个IO密集型操作来说采用异步方式可以大大提高系统吞吐量。异步不需要等待被调用方执行完成就可以执行其他的逻辑在被调用方执行完毕之后通过通知回调的方式反馈给调用方。“异步本质上是一种编程思想一种编程模型。他提高的是系统整体的吞吐量但是请求的响应时间对比同步方式来说会略微加大。像平时用的最多的消息队列在模型上也属于异步编程模型。调用方会把消息丢到队列中然后直接返回去执行其他业务被调用方接收到消息然后进行处理然后根据具体的业务看是否需要给予结果回复。有不少秒杀系统会采用消息队列进行流量削峰这是异步带来的优势之一。image关于异步更加详细的介绍可以查看之前的推文问世间异步为何物在这里我需要多说一句异步并不是没有代价在多数情况下采用异步会比同步方式编写更多的代码而且查找bug会花费更多的时间。但是对于一个高并发系统来说异步带来的益处还是值得的前提是你正确应用了异步。●程序员修神之路--为什么我会了SOA你们还要逼我学微服务●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁●程序员修神之路--设计一套RPC框架并非易事●程序员过关斩将--要想获取我的用户信息就得按照规矩来●程序员过关斩将--更加优雅的Token认证方式JWT●程序员过关斩将--cookie和session的关系其实很简单●程序员修神之路--用NOSql给高并发系统加速●程序员修神之路--高并发系统设计负载均衡架构●程序员过关斩将--你为什么还在用存储过程●程序员修神之路--问世间异步为何物●程序员修神之路--提高网站的吞吐长按添加菜菜好友关注后回复“大礼包”和“福利”领取惊喜