并发和高并发
一、并发(Concurrency)
1. 核心思想
并发指的是系统有能力同时处理多个任务。注意,这里的“同时”并不一定是物理上的同一时刻,而是指在一段时间内,多个任务都在向前推进。
2. 一个生动的比喻:咖啡馆里的一个服务员
想象一个咖啡馆,只有一个服务员(代表计算机的单个CPU核心)。
- 场景:此时来了三位顾客,分别点了美式、拿铁和茶。
- 并发的工作方式:这个服务员不会先做完美式再做拿铁最后做茶。他可能会:
- 先为美式按下咖啡机的按钮。
- 在咖啡机工作的同时,赶紧为拿铁蒸牛奶。
- 在蒸牛奶的间隙,给第三个顾客泡上茶。
- 最后回来完成美式和拿铁。
在这个过程中,虽然任何一个瞬间服务员只在做一件事,但在一段时间内(比如5分钟),他同时推进了三个订单的任务。 这就是并发。
3. 技术上的实现
在单核CPU时代,并发是通过时间片轮转实现的。操作系统飞快地在多个任务(进程/线程)之间进行切换,由于速度极快,用户感觉不到停顿,就像多个任务在同时进行一样。
并发的关键目的:不是为了提高速度,而是为了提高效率和响应能力,避免因为一个任务等待(如等待IO)而让整个系统卡死。
二、高并发(High Concurrency)
1. 核心思想
高并发指的是系统在极短的时间内(比如1秒钟)同时处理大量的访问请求。它是“并发”的一种特定场景,强调的不是处理方式,而是巨大的任务数量。
2. 继续用比喻:星巴克的中央厨房
现在想象“双十一”的淘宝,或者春运抢票的12306。
- 场景:这不是一个有三杯饮料的咖啡馆,而是一个高峰期每分钟要出几千杯饮料的超级中央厨房。
- 高并发的工作方式:一个服务员绝对忙不过来。这就需要:
- 多个服务员(代表多个CPU核心/多台服务器,即分布式集群)。
- 高度分工:有人专做浓缩,有人专蒸牛奶,有人专点单(代表服务拆分、微服务)。
- 高效的协作机制:如何传递订单和原料才不会混乱(代表消息队列、负载均衡)。
- 强大的原料供应:保证牛奶和咖啡豆不会瞬间用完(代表数据库性能、缓存)。
- 有序的排队系统:当订单多到厨房处理不过来时,如何让顾客排队而不流失(代表流量控制、限流、降级)。
3. 技术上的挑战与解决方案
高并发系统设计是一个复杂的工程,主要解决以下问题:
- 计算能力:使用多台服务器(集群)而不是单台服务器来处理请求。
- 流量分配:使用负载均衡器(如Nginx)将海量请求合理地分发给后端不同的服务器。
- 数据读写:
- 缓存:将高频读取的数据(如商品信息)放在内存(如Redis)中,极大减少直接访问数据库的压力。
- 数据库优化:读写分离、分库分表,将一个巨大的数据库拆分成多个小的。
- 异步处理:对于非即时需要的操作(如下单后发短信通知),将其放入消息队列(如Kafka, RabbitMQ)中慢慢处理,快速响应用户。
- 应用架构:采用微服务架构,将一个大应用拆分成多个小而自治的服务,便于独立扩展和维护。
- 保护系统:实施限流、熔断、降级策略,在流量远超系统负荷时,选择性地拒绝部分请求或关闭次要功能,保护核心系统不崩溃。
总结与对比
特性 | 并发 (Concurrency) | 高并发 (High Concurrency) |
---|---|---|
关注点 | 处理方式:系统如何交替执行多个任务 | 任务数量:系统在单位时间内处理的请求量极大 |
核心目标 | 提高效率、保证响应性、充分利用资源 | 保证系统在巨大流量下的稳定性、可用性、扩展性 |
实现层面 | 更多是编程层面的概念(多线程、协程) | 更多是系统架构层面的概念(集群、缓存、负载均衡) |
比喻 | 一个服务员同时照看多个订单 | 一整个团队和流水线应对海量订单的冲击 |
关系 | 高并发是并发的一种极端场景。实现高并发系统,需要很好地运用并发编程技术。 |
简单来说:
- 并发是一种能力,是“怎么做事”的方法。
- 高并发是一种场景,是“要做的事太多”的压力。
程序员写多线程代码是解决并发问题。
架构师设计分布式系统是解决高并发问题。