服务端运行机制及Golang多用户HTTP请求处理问题咨询
服务端开发问题解答
1. 服务端代码运行状态
常规的常驻型服务端(如Web服务、RPC服务)代码启动后会持续处于运行状态,全程监听指定端口接收请求,只有进程被主动终止或运行崩溃时才会停止。
只有Serverless类的轻量化服务才会采用请求触发运行的机制,无请求时实例会被销毁,收到请求时才会临时拉起实例处理逻辑。
2. Golang HTTP服务相关疑问
(1)请求与服务端实例的关系
所有用户共用同一份服务端代码实例。Golang标准库net/http默认会为每个收到的HTTP请求分配独立的goroutine处理,不会为单个用户单独启动独立的服务进程/实例。
(2)GET请求自增变量的统计结果
- 如果变量是定义在请求处理函数外部的全局变量:100个用户各发起1次请求后,变量最终值为100,所有请求共享该变量的内存空间。需要注意普通变量直接自增在并发场景下存在竞态问题,最终结果可能小于100,需要用
sync/atomic包的原子操作或加锁保证计数准确。 - 如果变量是定义在请求处理函数内部的局部变量:每个请求的变量都是独立的,请求处理完成后变量就会销毁,每个请求对应的统计值都为1。
(3)数千并发请求是否需要排队
默认不需要大面积排队。Golang的goroutine是用户态轻量级线程,创建和调度开销极低,默认配置下可以轻松支撑数千级别的并发请求,各请求的处理逻辑互相独立,只要服务端CPU、内存等硬件资源充足,下游依赖(如数据库、缓存)没有瓶颈,就不会出现请求排队的情况。
只有当并发量超过服务端实际处理上限时,才会出现请求堆积排队的情况。
内容的提问来源于stack exchange,提问作者Notorious776
相关产品推荐
相关产品推荐

