简单的网络服务器结构

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)

ShengYg

Step after step the ladder is ascended.


Tags •