专栏首页性能与架构架构设计 - 隔离术

架构设计 - 隔离术

隔离是通过将系统、资源分开,从而保证在发生问题时使其影响最小化,防止出现雪崩效应。

例如系统中有服务接口 A B C,因为某些原因,接口A的访问量激增,占用了大量系统资源,导致 B C 接口也无法正常运行了。如果使用了隔离机制,即使A的访问量很大,也不会影响 B C,把影响限定在一定范围,提高了系统的可用性。

隔离术是保证系统高可用的重要手段,常用的隔离方式有以下几种。

1. 线程隔离

比如 Tomcat 有一个线程池,接收请求后就从线程池中分配一个线程进行处理。

比如请求业务A的量很大,线程都分给A了,B的请求来了以后就无法快速响应。

这时我们可以进行线程隔离,使用多个线程池来进行隔离,这样即使某个线程池很忙,也不会影响另一个。

2. 进程隔离

一个应用系统中会包含多个模块,例如有论坛模块、交易模块。

当系统访问量大了以后,局部性原理的效果显现出来,一定会有某个模块的访问比例是极高的,比如是论坛模块,系统资源大部分都被其占用,就会影响其他模块的运行效率,而且论坛模块访问量大,其出现故障的概率也就更大,如果出现故障就可能导致整个系统不可用。

这种情况下较好的解决方案就是使用进程隔离,把系统拆分为多个子系统实现物理隔离,互不影响。

3. 集群隔离

单实例服务无法满足需求后,就会部署多个服务,形成服务集群来提升性能。

例如商品服务,部署多个实例,每个实例都包含相关服务功能:

秒杀是比较特殊的服务,瞬时访问量会非常大,当发展到一定程度后,势必会影响其他服务,这时就可以把秒杀提取出来,与其他服务隔离开。

4. 机房隔离

随着系统规模的增大,对可用性要求的增加,会进行多机房部署。

本机房的服务只调用本机房服务,不进行跨机房调用,如果一个机房发生故障,可以通过 DNS/负载均衡将请求切换到另一个机房。

5. 读写隔离

比如数据库,刚开始读写都操作一个数据库实例,当规模上来后,就可以使用读写分离模式,提升了性能,而且即使写入的库出现故障,也不影响读操作。

再比如 Redis 集群,也可以使用读写隔离来提升可用性,读服务只读取从集群,主集群故障后,从集群还可用,并且当一个从集群出现故障后,还可以到另一个群中重试。

6. 动静隔离

Web服务器中包含静态资源(例如 JS CSS文件)、动态资源(例如 JSP PHP 文件),对于静态资源,服务器其实只是存储的作用,用户请求时直接返回,无需计算,这就可以将静态资源放到 CDN 上,既可以提升静态资源的加载速度,又减轻了服务器的压力。

7. 爬虫隔离

如果爬虫的访问量已经对系统性能产生了一定影响,就一定要把爬虫的访问隔离出来,可以在负载均衡层面将其路由到单独集群,保护系统的正常业务。

Nginx 中配置示例代码:

set $flag 0; 
if ($http_user_agent ~* "spider") { 
    set $flag "1"; 
} 
if($flag = "0") {
    //代理到正常集群
}
if ($flag = "1") { 
    //代理到爬虫集群
}

8. 热点隔离

前面例子中的秒杀就属于热点,所以需要对其进行隔离。

对于读类型的热点,可以使用 多级缓存 来处理。对于写类型的热点,可以使用 缓存+队列 的模式。

9. 资源隔离

常见的资源例如CPU、磁盘、网络。

比如使用 docker 容器时,有的容器写磁盘非常频繁,就需要考虑为不同的容器挂载不同的磁盘。

比如 redis nginx,我们可以为其绑定CPU来提升性能。

再比如大数据计算集群、数据库集群应该与应用集群网络隔离。

内容整理自《亿级流量网站架构核心技术》

点击?阅读原文,查看文章列表

本文分享自微信公众号 - 性能与架构(yogoup)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 图解 Java 线程生命周期

    创建线程(NEW),然后线程做自己的工作(RUNNABLE),做完之后就终止了(TERMINATED)。

    dys
  • 浏览器的UI线程

    所有用于更新用户界面的操作都是由浏览器的UI线程来完成 UI线程维护一个队列,把每个要更新UI的操作都做为一个任务添加到队列中,然后等UI线程空闲时再按顺序进...

    dys
  • 高级的 Redis Java客户端 - Lettuce

    dys
  • 电商交易高并发和高可用技术(一)

    电商交易属于核心业务,比如有这么一个场景同一个商品有1000个库存,那么现在有10000个人同时买这个商品,那么在保证这个1000个库存商品全部卖光的前提下,那...

    用户6969969
  • Apache和PHP三种结合方法、三种MPM模式及解析漏洞

    为了减少频繁创建和销毁进程的开销,apache在启动之初,就预先fork一些子进程,然后等待请求进来。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。

    宸寰客
  • Python线程和进程(下)

    queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue。python3是小写的queue即可

    润森
  • 扩展ThreadPoolExecutor实现线程池监控

    在开发中,我们经常要使用Executors类创建线程池来执行大量的任务,使用线程池的并发特性提高系统的吞吐量。但是,线程池使用不当也会使服务器资源枯竭,导致异常...

    九州暮云
  • 【深度知识】GO语言的goroutine并发原理和调度机制

    Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主...

    辉哥
  • MyDumper原理简介

    相对于 MySQL 官方提供的逻辑备份工具 mysqldump,mydumper 最突出的特性就是可采用多线程并行备份,极大提高了数据导出的速度。本文基于 my...

    ivansqwu
  • 并发编程3:线程池的使用与执行流程

    并发编程系列的文章酝酿好久了,但由于没有时间和毅力去写那么多练习 demo,很多文章写了一半就停止了。 在写某一系列的过程中总有其他想写的内容蹦出来,想忍住不分...

    张拭心 shixinzhang

扫码关注云+社区

领取腾讯云代金券