可扩展web架构设计

《Scalable Web Architecture and Distributed Systems》一文阐述了现代web架构的设计原则,并用由浅到深的案例总结了如何去做设计。看了下做下总结。

在设计高性能web架构时,我们需要考虑的几个点:

  • Availability,可用性。大型网站和分布式系统对可用性的要求一般都非常高,这是基本的技术要求。还包括异常恢复机制、回退机制等。
  • Performance,性能。访问网站的速度,并发的数量等等,网站的性能也非常重要。
  • Reliability,可靠性。成功上传的资料要确保不会丢失,相同的请求不会又二义性。
  • Scalability, 可扩展性。系统能处理多少额外的流量,扩展的难度大小等等。
  • Manageability,易于管理。网站足够人性化,方便操作。也包含升级等操作的容易程度。
  • Cost,费用。整套系统的费用。

小型项目简单的lamp这样已经足够。

几块提高性能的方法:

  • Caches,缓存

通过在请求层将数据加入cache,命中的请求将不用再去后台data层查询,减少io时间。

当扩展为多个node时,每个node都有自己的cache。

如果外部负载均衡随机分发请求,那么cache命中将降低。有全局缓存的2个方案可以尝试:

  • Global Cache,全局缓存

所有的node先去全局缓存去查,当数据不在缓存中时,缓存会去data层拉,再由cache返回数据。

另一种方案是,所有的node先去全局缓存去查,当数据不在缓存中时,node再发请求去data层拉,再由cache返回数据。

一般更倾向选第1种,毕竟第2种对相同请求可能降低命中率,同时增加了data层的负载。但有些情况也会考虑2,例如大文件cache的数量少等。

  • Distributed Cache,分布式缓存

每个node都拥有部分缓存。有个好处是增加缓存只需要增加node,但不好的是增加了缓存管理难度。

  • Proxies,代理

代理可以平滑流量,对于大量相同请求再加上cache,可以提高性能。

很多请求相邻数据时,proxy还可以一次拉回一批数据,这样对整个性能提升较多。

  • Indexes,索引

书可以有目录,大量数据可以有索引,它们是相似的。

  • Load Balancers,负载均衡

负载均衡可以把请求分发给业务,采用随机等策略。也可以分发给不同的负载均衡。

其中一个挑战是,session问题。一个请求分到某个node做了操作,下一次不是相同node怎嘛办?一种办法是相同用户的请求转发给相同node,自然session是相同的。但node失效等时候回带来麻烦。还可以考虑全局session、 browser caches, cookies, and URL rewriting等等来解决。

  • Queues,队列

通过将请求任务放入队列,服务端从队列中获取任务处理,这样的模式会极大提高服务端的处理能力、耗时任务的处理延时,在后台中有较多的使用。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区