今天继续坑系列,
我们看到的高并发技术围绕这个核心技术,通常我们看到的各种高并发的架构系统,在博客,论坛,现场分享出来的高并发系统,都跑不出以下几个方面的东西。 资源静态化就是那种单个页面流量巨大无比,每秒的QPS几十万上百万的系统,确实 读写分离和分库分表读写分离是大家看到的第二个高并发的架构了,也很常规,因为一般情况下读比写要多得多,所以数据库的主库写,从库们提供读操作,一下就把数据库的并发性能提高了。 如果还不够,那么分库分表把,把数据分到各个数据库的各个机器上,进一步的减少单台机器的压力,从而达到 如果是分库分表,有时候使用的就是 万能的缓存说到高并发,不得不说缓存了,现在各种缓存的工具也很多也很成熟, 无敌的哈希但凡大数据处理,高并发系统,必言哈希,随机插入,时间复杂度O(1),随便查询,时间复杂度O(1),除了耗费点空间以外,几乎没什么缺点了,在现在这个内存廉价的时代,哈希表变成了一个高并发系统的标配。 正面的例子我们来看个例子,看看一些个大家眼中标准的高并发系统的设计,这些设计大家应该都看过,无非就是上面的几个要点,最重要的就是 活动秒杀页面活动秒杀页面,这是个标准的高并发吧,到了搞活动的那个时刻,单页面的访问量是天量数据了,但这种系统有个特点 活动页面的冲击感实在太强,想象一下几千万人同时访问网站还没有挂,让很多人觉得 这样的场景再扩展一点,就是凡是能提前提供数据的并发访问,就可以用 12306接下来,我们再看看这个星球并发量最疯狂的网站,瞬间的访问量碾压其他网站的12306,这种场景下的高并发也有个特点,那就是 类似的其实还有商品的抢购系统,商品和车票一共就1000张,你100万的人抢,你系统做得再好,也无法给100万人提供服务,之前12306刚刚上线的时候很多人喷,说如果让某某公司来做肯定能做好,但大家很多只看到了表面,让某很厉害的公司来做,最多也只能做到大家访问的时候不会挂掉,你买不到车票还是买不到,而且现在的12306体验也已经做得很好了,也不卡了,但是还是很多人骂,为什么?还不是因为买不到票。 对于这样的系统,设计关注的就不仅仅是提高性能了,因为性能瓶颈已经摆在那了,就1000张票,做得更多的是分流和限流了,除了 我们给这样的场景再扩展一下,凡是不能提前提供数据的,可以通过 高并发系统如何设计如果把上面两个场景的情况合并一下,仿佛 合理的数据结构举个例子来说吧,搜索提示功能大家都知道吧,就是下面这个图的东西。  ![]() 如果是google,baidu这种大型搜索系统,或者京东淘宝这种电商系统,搜索提示的调用量是搜索服务本身调用量的几倍,因为你每输入一个键盘,就要调用一次搜索提示服务,这算得上是个标准的 可能很多人脑子里立刻出现了 了解的人应该知道,没有人会这么来实现,这种搜索提示的功能一般用 高并发系统的设计,关键在合理的数据结构的设计,而不在架构的套用 不断的代码性能优化有了上面的数据结构,并且设计出了系统了,拿到线上一跑,效果还行,但感觉没达到极限,这时候可千万不能就直接上外部工具(比如缓存)提升性能,需要做的是不断的代码性能的优化,简单的说,就是不断的review你的代码,不断的找出可以优化的性能点,然后进行优化,因为之前设计的时候就已经通过理论大概能算出来这个系统的并发量了,比如上面那个搜索提示,如果我们假定平均每个搜索词6个字符,检索一次大约需要查询6次,需要2-3毫秒,这样的话,如果8核的机器,多线程编程方式,一秒钟最多能接受3200次请求(1000ms/2.5ms*8),如果没达到这个量级,那么肯定是代码哪里有问题。 这个阶段可能需要借助一些个工具了,JAVA有JAVA的性能优化工具,大家都有自己觉得好使的,我本身JAVA用得很少,也没啥可推荐的,如果是Golang的话,自带的 或者最简单的,就是把各个模块的时间打印出来,压测一遍,看看哪个模块耗时,然后再去仔细review那个模块的代码,进行算法和数据结构的优化,我个人比较推崇这个办法,虽然比较笨,但是比较实在,性能差就是差,比较直观能看出来,也能看出需要优化的点,而且比较贴近代码,少了外部工具的干扰,可能也比较装逼吧。 这个过程是一个长期的过程,也是《重构:改善代码的既有设计》中提到的,一个优秀的系统需要不断的进行代码级别的优化和重构,所以 高并发系统的实现,就是不断的优化你代码的性能,不断逼近你设计时的理论值 再考虑外部通用方法以上两个都完成了,并发量也基本达到理论值了,但是还有提升的需求,这时候再来考虑外部的通用方法,比如加一个LRU缓存,把热词的查询时间变成O(1),进一步提高性能。 说起LRU,多说一句,这是个标准的 在没把系统的性能压榨完全之前,不要使用外部的通用方法,因为使用了以后就没有太多进一步优化空间了。 最后靠运维技术了上面几种都已经弄完了,还需要提升性能,这时候再考虑运维的技术了,比如常规的加负载均衡,部署成集群之类的,通过运维和部署的方法提高服务的并发性。
总结罗里吧嗦说了这么多,其实我就想表达一个意思,不管是前面的 代码才是关键,架构都是锦上添花的东西,既然是锦上添花的,必然坑多,没有什么捷径。 代码的健壮性决定了高可用,这些印度人就能做到,而高性能,高并发需要的不仅仅是代码的健壮性,还有数据结构的设计和代码的调优能力了。 架构模式是大家总结出来的,和你的系统可能关系不是很大,学习太多的架构,脑袋会乱,还不如实打实的看几本书,然后对着架构多推敲练习,很多人对数据结构嗤之以鼻,觉得对于现有的开发来说,数据结构没那么重要了,但对于后端开发来说,数据结构是很重要的技能,虽然面试的时候不会让你去翻转一棵二叉树,但二叉树是什么,什么场景下用还是应该知道的吧? 找准合适的数据结构,不断的优化代码,这样来提升你的系统性能,这样的系统才是你可控的,才有不断优化的空间,更好的 这几篇我觉得我都在瞎扯淡,虽然比较虚,但也是我工作这么些年淌坑无数以后的总结吧,后面的文章会写一些实际的了,我的搜索引擎部分还没写完呢。尽请期待。呵呵。。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|