January
29th,
2019
简单的网络服务器结构
while(1){
request = wait_for_request();
filename = parse_request(request);
contents = read_file(filename);
send contents as reponse;
}
并行
worker pool
Apache:父进程动态维护worker pool,创建一堆空闲workers,需要时启用
worker是进程而不是线程,因为安全性,一个worker的损坏不会影响其他。
方案
- 增加吞吐量:请求通过一个Load Balancer分发到多个网络服务器上,然后服务器向数据库发出请求
- 负载均衡:同一个会话的请求发送到同一个服务器(session affinity),每个服务器保留一个session state;服务器的损坏会导致整个session丢失
- session state放在数据库中????
- 共享数据库产生竞争:
- 高性能数据库(软件不需要修改,但费用高)
- 复制成多个数据库(额外存储,一致性问题)
- 拆分成多个数据库
- 内部请求并行化
服务器数量
- 问题:网站负载有高峰和低谷
- 弹性:根据负载自动调整worker pool中服务器数量
- 请求增加时,排队时间增加,总响应时间增加,需要增加服务器
重用 && 局部性
- memcache:数据库的缓存,将经常查询的结果缓存
- CDNs(content distribution networks)