并发
并发与并行
- 并行:在同一时刻,有多条指令在多个处理器上同时执行
- 并发:在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行
进程 | 线程 | 协程
-
进程:是操作系统对一个正在运行的程序的一种抽象,是资源分配的基本单位
-
线程:是轻量级的进程,进程中的实际运作单位,是操作系统调度的基本单位
-
协程:是用户态的线程,调度完全由用户控制,拥有自己的寄存器上下文和栈
-
一个程序至少有一个进程,一个进程至少有一个线程
-
进程与线程区别:
- 进程间相互独立互不干扰,线程共享进程的资源
- 线程之间通信比进程之间通信更方便,线程切换比进程切换开销小
- 进程让操作系统实现并发性,线程让进程的内部实现并发
-
线程与协程区别:
- 线程是操作系统提供的,由内核调度,协程是由程序调度
- 协程是子程序切换不是线程切换
-
多进程使用场景:对资源的管理和保护要求高,不限制开销和效率时
-
多线程使用场景:要求效率高,频繁切换时,资源的保护管理要求不是很高时
GO并发
GO可以开多少协程
- 一个 goroutine 一开始占用4K内存,会受到内存使用量的限制
- goroutine 是通过系统线程来执行的,golang默认最大的线程数是10000个
- 理论上内存足够大且 goroutine 不是计算密集型的话,可以开启无限个goroutine
GO多协程控制
- 固定个数协程并发处理任务
- 一般叫做Bounded/Fixed并发控制
- 优点:简单;缺点:可能流量不均衡
- 动态个数协程并发处理任务
- 解决固定个数协程的缺点,指定一个并发上限,动态修改协程个数
- 自定义令牌池
- 令牌池维持 最大允许并发任务数 个令牌,每个任务启动时请求令牌,运行完成返回令牌。
- 信号量Semaphore实现
- 令牌池换成信号量
- 指定处理速度并发处理任务
- 借鉴限流器:控制每个时刻最大允许协程数量也达到控制协程数量的目的
- 自定义令牌池
- 指定速度生产令牌,每个任务启动时必须请求到令牌
- 官方限流器
- 协程池并发处理任务
- 推荐:ants
上万的 QPS 策略
-
水平扩展:增加服务器、增加资源,使用负载均衡来分发请求
-
数据库优化:优化数据库查询,使用适当的索引和查询优化技术
-
缓存:使用缓存来存储频繁访问的数据,减少对数据库或其他后端系统的请求
-
异步处理:将一些耗时的操作转换为异步任务,如使用消息队列来处理后台任务,从而减少请求的响应时间
-
代码优化:检查应用程序代码,识别并优化性能瓶颈
-
资源优化:使用监控工具来实时监测系统性能,并根据指标数据进行调优和优化
-
CDN加速:使用内容分发网络(CDN)来缓存和分发静态资源,减轻服务器的负载,提高用户访问速度
-
降级服务
- 关闭非关键功能:暂时关闭一些非关键的功能或服务,以减轻系统的负载
- 限制服务范围:只提供给核心用户或关键业务,暂时不接受其他请求
- 降低服务质量:降低服务的响应速度或降低服务的容错性,以减少对系统资源的消耗
- 异常处理:对于异常或错误的请求,可以直接返回错误响应,避免进一步的处理
-
限流
- 固定窗口限流: 在固定的时间窗口内,限制处理请求的数量或速率
- 滑动窗口限流: 根据最近一段时间内的请求情况,动态调整处理请求的数量或速率
- 令牌桶限流: 基于令牌桶算法,为每个请求分配令牌,只有拥有令牌的请求才能被处理
- 漏桶限流: 基于漏桶算法,控制请求的流出速率,超过桶容量的请求将被丢弃或延迟处理
-
熔断:
- 一种针对服务间依赖关系的保护机制
- 通过设置阈值来监控系统的负载情况,当系统负载超过预设的阈值时,触发熔断器并暂时停止对该服务的请求
负载均衡
- 静态负载均衡算法
-
轮询法
-
加权轮询法
-
随机法
-
加权随机法
-
- 动态负载均衡算法
-
最少连接数法
-
最短响应时间法
-
一致性哈希
-