一、服务器高并发的解决方案
应用数据与静态资源分离
将静态资源(图片,视频,js,css 等)单独保存到专门的静态资源服务器中,在客户端访问的时候从静态资源服务器中返回静态资源,从主服务器中返回应用数据。
客户端缓存
因为效率最高,消耗资源最小的就是纯静态的 html 页面,所以可以把网站上的页面尽可能用静态的来实现,在页面过期或者有数据更新之后再将页面重新缓存,或者先生成静态页面,然后用 ajax 异步请求获取动态数据。
集群和分布式
(集群是所有服务器都有相同的功能,请求哪台都可以,主要起分流作用)
(分布式是将不同的业务放到不同的服务器中,处理一个请求可能需要使用到多台服务器,起到加快处理请求的速度)
可以使用服务器集群和分布式架构,使得原本属于一个服务器的计算压力分散到多个服务器上,同时加快请求处理速度。
反向代理
在访问服务器的时候,服务器通过别的服务器获取资源或结果返回给客户端。
二、协程了解吗?
协程和微线程是一个东西。
协程就是子程序在执行时中断并转去执行别的子程序,在适当的时候又返回来执行。
这种子程序间的跳转不是函数调用,也不是多线程执行,所以省去了线程切换的开销,效率很高,并且不需要多线程间的锁机制,不会发生变量写冲突。
三、那协程的底层是怎么实现的?
保存和恢复上下文
协程的实现关键在于能够在不同协程之间快速切换执行。这需要保存当前协程的执行上下文,
包括程序计数器、寄存器值、栈指针等,以便在下次恢复执行时能够准确地回到上次暂停地位置。当从一个协程切换到另一个协程时,将当前协程地上下文保存起来,然后加载目标协程上下文,实现执行权地转移。
例如,在一些编程语言地协程实现中,会使用特定地数据结构来存储协程地上下文信息,当需要切换时,通过对这些数据结构地操作来完成上下文地保存和恢复。
调度机制
协程需要一个调度器来决定何时切换协程以及切换到哪个协程。调度器可以根据不同的策略进行调度,如轮询调度、基于事件的调度等。
对于轮询调度,调度器会依次遍历所有可运行的协程,给予每个协程一定的执行时间片,当时间片用完后切换到下一个协程。基于事件的调度则根据特定的事件发生来触发协程的切换,例如当某个 I/O 操作完成时切换到等待该操作的协程继续执行。
栈管理
每个协程都有自己的栈空间,用于存储局部变量、函数调用参数等。协程的实现需要有效地管理这些栈空间,以确保协程之间地切换不会导致栈数据地混乱。
一种常见地做法是在协程切换时,根据需要动态地调整站的大小,或者使用共享栈的方式,多个协程共享一个较大的栈空间,通过一些标记和管理机制来区分不同协程在栈上的数据。