很多情况下都要解决高并发的问题,要理解并发并行的概念
并行parallel,同时有几件事情要一起做,在这一时刻要做这么多事
并发 concurrency,在一段时间内有这么多事情要做
并行更讲究在同一时间点是否有多件事情一起做,就是平行线有很多事情一起做,等于高速车道每个车道都有车,在同一时刻有这么多事要做
并发讲究在某一时刻有这么多事情要做
一个同一时间,一个是同一时刻,高并发必须解决,早些年淘宝交易的时候就会出现这种问题,服务器顶不住死机了,早些时候,淘宝扛得住,银行扛不住,把钱提前到弄到支付宝这里来
一般互联网公司要的就是流量,人数,所以这个时候,并发肯定会出现,京东也是从小的到大的转型,都是一个进化的过程,并发看似简单,非常重要
怎么解决,总共有几点,类似食堂打饭,几个人去无所谓,但是一个学校几千人在一个时间点去就是高并发
假如食堂就一个打饭窗口,解决方案
第一个就是排队(当并发到来的时候,资源只有一个,那就排队解决,排队对应学过 数据结构就是队列,先到先得,允许插队就列表,不允许插队就是队列queue,可能会使用优先队列,会有个优先级的问题,优先级有个数值标识,先处理优先级小的或者是大的)
高并发,大家都想解决一件事,吃饭,在这一段时间内就需要大量的请求处理,淘宝早期就是排个队,排队有时候在高并发面前也先得无力。
队列也称为缓冲区,buffer
priorityqueue优先队列,lifoqueue后进先出队列
对于不太在意用户等待时间的,完全可以使用队列应对高并发,而且简单易用,用队列做到一个平滑的作用,不要把压力放到窗口上去,应该压在队伍上去,队伍适合排队,往后追加
是比较流行的解决方案
还有一种争抢模型,谁抢到谁就先吃,只要空闲。立马会有一个等待中的抢到资源,把资源使用完,就立即下面等待的继续抢,但是必须锁定窗口一段时间,保证那个用户使用完资源,但是有可能有些身强体壮的,连续抢,弱小的用户就抢不到,所以争抢模型有些弱小的使用者永远抢不到资源,有一些请求者永远得不到响应
争抢不代表效率低,副作用就是有些有可能很长时间都抢不到
抢到之后会占有一段时间,在这段时间内,要锁定这个窗口,不允许别人来继续抢,就要有锁机制,只要资源有人争,就必须要有锁
**如果是你点菜,炒青菜,但是青菜还需要洗,就需要有另一种方法,预处理,把大多数人喜欢吃的,提现准备,这样别人来吃的时候就打饭直接吃,如果是冷门的就需要等待吃饭,大多数人都很快,只有个别人需要单独做一下即可,把大多数人要吃的准备好,这就是预处理的思想
**
为了加快速度,其实都是预先放内存里,属于缓存的思想,不是缓冲,把大多数人要的热点数据提前加工好到内存里,预处理的思想是非常重要的,比如字典,redis,分布式的kv存储数据库,预处理思想是高并发常用的解决手段,其实就是提高用户访问的速度,从而快速减少排队的压力
但是上面的窗口都是一个,太少了,可以不可以多开几个窗口
并行,有的队伍处理慢,有点队伍处理快,但是可以用某些方法检测哪些队伍清闲点,可以把1000人的问题分散掉,比如一个电脑开10个进程,1个进程开10个线程,都是并行,但是1核CPU开10个进程是没什么用的,1 个cpu是交替来做的,相当于是串行
两个cpu的叫两路,每个cpu里面有多核,每个核心认为是cpu,服务器可以插多个cpu的,现在一般一个cpu封多个核心的
但是并行不是越多越好,成本很高,一个服务器扩增到2个,就是称为水平扩展,虽然用了并行但是还得用到队列。
水平扩展就是扩建食堂窗口,跟扩服务器一样,都是要增加成本,但是都可以并行来处理的
并发指的是在这一段时间内要解决这么多问题,并行指的是在同一时刻在做这些事情,在这里,并行是解决并发的其中一种解决方案而已,并行可以水平扩展,想扩展几台服务器就扩展几台。
比如用服务器的虚拟化技术,云技术主要是通过 逻辑上管理,通过弹性的扩展和收缩,来解决水平扩展的问题,云技术也可以度量,多少cpu运算能力
如果只有单个cpu核心就不是并行了,一般多个cpu还是分布式都是并行处理,
并行处理也是解决并发的方案
窗口速度太低,提高速度,就是单机的升级,垂直提高,单机向上
排队在系统外就是第三方队列,比如坐地铁排在了地铁外面,跟坐地铁是没有关系的,还得过第三方安检,过了安检,还要在地铁门口排队。
理解为两个队列,一个队列是跟应用程序相关queue,系统外的队列,一般使用第三方队列,在数据传输上也称为message,消息队列
队列的核心作用就两个,解耦和缓冲,
站外和在站内的队列其实就是解耦,大量的人做缓冲用,站在地铁门口的队列是queue模块里的,外面的是第三方队列
大数据用kafka比较多,分布式
apache最让人知道的就是httpd的web服务
apache的顶级项目非常多,zookeeper,redis,kafka
据说可以替代redis,impala非常重要
nutch分布式爬虫,,整个大数据从这里开始
消息中间件对我们来说非常重要,系统开始扩展的时候,单机并不需要,一旦程序开始扩展,消息中间件和缓存都需要有,一般不会采用单一手段来解决,多种方式混合来优化组合
数据越来越多。有价值的数据少,需要更加精密的程序来参与
还有一些方案,比如分地,一个地方食堂不够,就搞多个食堂,就宿舍附近设立,(也就是就近思想)
多地服务器通过dns服务引导(全中国搞很多服务器,通过dns来引导,各地分流,所以为了数据不同步,就要搞异地同步什么的),把内容就近放到你面前,这个就是CDN技术
并发和并行,更主要的是并发的概念,并行无非是并发的一种解决方案而已,常见的就如下,