1. 首页
  2. Python

高并发解决方案

 
并发的解决:
以食堂打饭为例:
中午12点开饭,大家都涌向食堂,这就是并发;如果人很多,可能就是高并发。
 
1、队列、缓冲区
假设只有一个窗口,陆续涌入食堂的人,排队打菜是比较好的方式;所以,排队(队列)是一种解决并发的方法。
排队就是把人排成队列,先进先出,解决了资源使用的问题;排成的队列其实就是缓冲地带,就是缓冲区
假设女士优先,每次都从这个队伍中优先让女生出来先打饭,这就是优先队列
例如queue模块的类Queue、LifoQueue、PriorityQueue(小顶堆实现)。
 
2、争抢
只开一个窗口,有可能发生争抢,谁先挤进去抢占窗口就先给谁打饭。挤到窗口的人占据窗口,直到打到饭菜离开。
其他人继续争抢,总是有一个人会抢占窗口,可视为锁定窗口,窗口就不能为其他人提供服务了;这是一锁机制。谁先抢到资源就上锁,排他性的独占锁,其他人只能等待。
争抢也是一种高并发的解决方案,但是,不好的地方在于可能有人长时间抢不到。
 
3、预处理
排队长不是问题,问题在于处理并发的速度太慢。如果能快速处理掉这些并发,那也没什么问题。
经过分析,发现原来每个人点的菜都是现点现做的,导致等候的时间太长。
食堂可以统计最受大家欢迎的菜品,将80%的热门菜提前做好,直接供应,20的%冷门菜,点的时候再做。
这样大家就算不排队采用争抢的方式锁定窗口,也可以很快拿到饭菜离开,快速释放窗口。
这是一种提前加载用户需要的数据的预处理方案,缓存常用。
 
4、并行
很多人同时来吃饭,一个窗口一个队伍搞不定,可以开设多个打饭窗口形成多个队列,并行打菜。但是开设多个窗口,需要窗口的材料费、需要多雇人,必然导致成本上升
在实际生产中,可以通过购买更多服务器,或多开进程、线程实现并行处理,来解决并发问题。
这些都是水平扩展的方案。并行是解决并发的手段之一。
 
注:如果线程在单CPU上处理,就不是真并行了;但是现在多数服务器都是多CPU的,服务的部署往往是多机、分布式的,这都是并行处理。
 
5、提速
提高单个窗口的打饭速度,也是解决并发的方案。可以提高打饭人员的工作技能,或为单个窗口配备多个服务人员,都是提速的方法。
提高单个CPU性能,或单个服务器安装多个CPU。这是一种垂直扩展的方案。
 
6、消息中间件
在北京、上海某些地铁入站口外,用栏杆相连形成的导流排队区域,缓冲人流,进去之后再多口安检进站。
这个导流排队区域就好比中间件,连接两个系统,一个是四面八方涌向地铁的出行人群(生产),一个是 地铁系统把人群送到各自目的地(消费)。并且当生产和消费都持续发生的时候,消费的速度必须大于或 等于生产的速度,否则容易发生问题。
常见的消息中间件有RabbitMQ、ActiveMQ、RocketMQ、kafka等
当然还有其他手段解决并发问题,但是已经列举出了最常用的解决方案,一般来说不同的并发场景用不同的策略,而策略可能是多种方案的优化组合。
例如多开食堂(多地),也可以把食堂建在生活区或者工作区(就近);这就好比利用CDN技术。

 

很多时候,技术来源于生活。

原创文章,作者:wz,如若转载,请注明出处:https://www.wzstyle.cn/770.html

发表评论

邮箱地址不会被公开。 必填项已用*标注