一、限流
为了保证核心服务的稳定性,随着访问量的不断增加,需要为系统能够处理的请求数量设置一个极限阀值,超过这个阀值的请求则直接拒绝。
可以在网络层(eg:阿里BGP),接入层(eg:Nginx),应用层(eg:RateLimiter)进行限流。
常见的限流算法有:计数器、漏桶和令牌桶算法。
二、负载均衡
服务高可用的保证手段,为了保证高可用,每一个微服务都需要部署多个服务实例来提供服务。此时客户端进行服务的负载均衡。
负载均衡工具如springcloud的ribbon。
负载均衡的常见策略:
1、随机
把来自网络的请求随机分配给内部中的多个服务器。
2、线性轮询
每一个来自网络中的请求,轮流分配给内部的服务器,从1到N然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求相对均衡的情况。
3、加权轮询
根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如:服务器A的权值被设计成1,B的权值是3,C的权值是6,则服务器A、B、C将分别接受到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。
4、IP Hash
这种方式通过生成请求源IP的哈希值,并通过这个哈希值来找到正确的真实服务器。这意味着对于同一主机来说他对应的服务器总是相同。使用这种方式,你不需要保存任何源IP。但是需要注意,这种方式可能导致服务器负载不平衡。
5、最少连接数
客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,并没有达到真正的负载均衡。最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡。此种均衡算法适合长时处理的请求服务,如FTP。
三、异步
“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。
异步实现方式举例:
1、springboot被@Async注解的方法是异步方法。如:Spring Boot使用@Async实现异步调用
2、多线程并发的情况,如 CompletableFuture实现异步操作
四、缓存
缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高并发访问量,也是保护数据库、保护系统的有效方式。大型网站一般主要是“读”,缓存的使用很容易被想到。在大型“写”系统中,缓存也常常扮演者非常重要的角色。比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及HBase写数据的机制等等也都是通过缓存提升系统的吞吐量或者实现系统的保护措施。甚至消息中间件,你也可以认为是一种分布式的数据缓存。
五、降级和熔断
降级和熔断都是一种服务容错思想。
关于降级的方法业界都已经有很成熟的方法了,比如Hystrix的fallback机制。当服务请求超时或错误时,走fallback方法。因此我们可以配置服务请求的超时时间。
Hystrix的CircuitBreaker机制可以实现熔断。当调用满足失败次数,失败比例就会触发熔断器打开。熔断器打开了,后续请求直接走降级方法fallback,不再调用主流程方法。 可以设置参数:x个请求开始进行熔断错误比率计算、当出错率超过xx%后熔断器启动、熔断器工作时间超过某个时间先放一个请求进去成功的话就关闭熔断失败就再等一段时间。
熔断器有3种状态:
- 关闭( Closed ):默认情况下Circuit Breaker是关闭的,此时允许操作执行。CircuitBreaker内部记录着最近失败的次数,如果对应的操作执行失败,次数就会续一次。如果在某个时间段内,失败次数(或者失败比率)达到阈值,CircuitBreaker会转换到开启( Open )状态。在开启状态中,Circuit Breaker会启用一个超时计时器,设这个计时器的目的是给集群相应的时间来恢复故障。当计时器时间到的时候,CircuitBreaker会转换到半开启( Half-Open )状态。
- 开启( Open ):在此状态下,执行对应的操作将会立即失败并且立即抛出异常。
- 半开启( Half-Open ):在此状态下,Circuit Breaker会允许执行一定数量的操作。如果所有操作全部成功,CircuitBreaker就会假定故障已经恢复,它就会转换到关闭状态,并且重置失败次数。如果其中任意一次操作失败了,Circuit Breaker就会认为故障仍然存在,所以它会转换到开启状态并再次开启计时器(再给系统一些时间使其从失败中恢复)。
网友评论