zoukankan      html  css  js  c++  java
  • 隔离术

    当服务发生故障不可用后,限定传播范围和影响范围,防止出现雪球效应。

    3.1 线程隔离

      将请求分类,交给不同的线程池处理(RocketMQ的broker各种线程池)。当一个业务请求发生问题时,不会将故障扩散到其他线程池。

    3.2 进程隔离

      将系统按业务拆分成多个子系统实现物理隔离。

    3.3 集群隔离

      同一服务部署多个相同实例,分担压力和在单个实例故障时使用负载均衡保障整体服务可用

    3.4 机房隔离

      多机房部署,每个机房的服务只应该调用本机房服务。当某个机房中某个服务发生故障,整个机房对外不可用。

    3.5 读写隔离

      读服务只读Redis,写服务写库

    3.6 动静隔离

      将静态资源放在CDN上

    3.7 爬虫隔离

      在负载均衡层面将爬虫流量路由到单独集群,比如使用Nginx或者OpenResty过滤爬虫和恶意IP

    3.8 热点隔离

      秒杀,抢购等做成系统单独部署,防止影响其他正常流程

    3.9 资源隔离

    3.10 使用Hystrix实现隔离

      1. 提供线程池隔离和信号量隔离

      2. 提供降级机制:超时降级、资源不足(线程或信号量)降级,降级后配合降级接口返回托底数据

      3. 提供熔断机制:当失败率达到阈值自动触发,熔断器触发的快速失败会进行快速恢复

      4. 提供请求缓存、请求合并

    3.11 基于Servlet3实现请求隔离

      Tomcat收到HTTP请求后,按照如下流程处理请求

      1. 容器负责接收并解析请求为HttpServletRequest

      2. 交给Servlet进行业务处理

      3. 最后通过HttpServletResponse写响应

      

      在Servlet2.x规范中,所有这些处理都是同步进行,也就是说必须在一个线程中完成从接收请求、业务处理到响应。

      在Servlet3中将请求异步化,Tomcat线程收到任务后丢到任务队列,由自定义的业务线程池处理。自定义的线程池由开发者控制,开发自由度大幅提升。

      1. 基于NIO能处理更高的并发连接数

      2. 请求解析业务处理线程池分离

      3. 根据业务重要性对业务分级,并分级业务线程池

      4. 对业务线程池进行监控、运维、降级等处理

      

      当发现请求过多,负载较高,最简单的方法是清空线程池,防止出现服务器雪崩。

      

    人生就像蒲公英,看似自由,其实身不由己。
  • 相关阅读:
    JSON 字符串 与 java 对象的转换
    DNS解析过程详解
    全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等
    TCP Send函数的阻塞和非阻塞,以及TCP发送数据的异常情况
    基于TCP协议的应用层的ACK机制
    Golang的反射reflect深入理解和示例
    C/C++中struct中内存对齐规则
    Go 包依赖管理工具 —— govendor
    什么是幂等?什么情况下需要考虑幂等?怎么解决幂等的问题?
    Golang 中间件简介 MiddleWare
  • 原文地址:https://www.cnblogs.com/walker993/p/14695045.html
Copyright © 2011-2022 走看看