C10K问题由来
在互联网还不够普及的年代,用户总数不多,一台服务器同时在线100个用户在当时已经算是大型应用了,此时并不存在C10k难题。
随着互联网普及率的提高,用户群体几何倍增长;另一方面互联网不再是单纯地浏览静态html网页,大型网站逐渐开始进行交互(提交表单、在线互动、即时通讯等),此时C10K的问题才体现出来。
问题:
设计一套RPC服务框架,使其支持单机1秒处理1万条请求到能力。
如何优雅地处理超大规模的并发请求?
1、多线程服务框架
为每一个连接分配一个独立的处理线程
缺点:1、占用的系统资源较多;2、大部分线程都在挂起状态
2、单线程服务框架(实际上有2个线程:主线程、工作线程)
2.1 主线程负责accept新的连接,并用list管理这些连接
2.2 工作线程采用IO多路复用的方式,轮询和采用回调的方式获知连接fd是否可读,并完成处理
缺点:1、要解决C10k问题,要求每个请求处理时间在1ms以内才行;
2、服务端某一时刻只能处理一条请求
3、多线程IO多路复用服务框架
与单线程服务框架不同的是,它有多个工作线程,可以在任意时刻处理多个请求,目前主流服务框架均采用此模式解决C10k问题