一、限流
1、什么是TPS
一般情况下,一个请求进来,服务端会从线程池中分配一个空闲线程供其使用。假设该服务A线程池最大数量为10,平均每个请求处理时长为10ms,有5个微服务A对外服务,则该服务A的最大TPS为5*1000,当请求数量每秒钟小于5000的时候,该服务完全能够对外服务。假设从历史情况来看,每秒种的请求数量维持在4500左右。当有一个服务宕机,这个时候四个微服务也能够对外提供4500的响应,因为每个请求有设计超时时间,超时时间的长短设计会影响成功率。但是当3个服务都宕机的时候,2个服务无法承载这么大的请求流量,这个时候就要对外限流了。
2、限流
当服务因为性能或者其他原因无法提供这么大并发量的时候,就需要考虑限流了。一般情况下,服务无法做到对自己做限流操作,一般由上游API网关、或者ESB做限流操作。例如ESB令牌的设计,令牌一般设置为下游服务所能提供的最大处理线程数量。有主调限流,调用方限流;被调限流,被调用方限流。
二、雪崩
1、什么时雪崩
在微服务之间进行通信服务调用时由于某一个服务故障,导致级联服务故障的现象叫做雪崩效应。雪崩效应描述的是服务方不可用,导致消费方不可用并将不可用逐渐放大的过程。比如如下服务调用过程:
用户服务,商品服务能够正常对位提供服务,但是库存服务因为某种原因响应比较慢或者服务有问题,当交易量增加的时候,库存服务因为无法经受这么大的交易量,而变得不可用,这会导致商品服务的请求也会变得阻塞,会慢慢耗尽商品服务的线程池资源,进而导致用户服务不可用。
所以微服务中雪崩产生的根本原因是在调用链路中链路的某一个服务因为响应时间过长,或者大规模出现异常导致自身服务不可用,并且将这种不可用进行放大的情况,就像雪崩一样。
当出现雪崩的时候可以对服务进行熔断或者降级来解决该现象。
三、熔断
1、什么是熔断(隔离)?
上游对下游做定时探测,当探测到下游服务不可用的时候,或者调用失败达到一定的比例时,触发自动熔断(隔离),把该服务从自己的可用列表中删除;当服务恢复的时候再把服务添加进来;探测的方法如下:
上游服务主动探测下游服务
- 1、端口探测,发现端口存活就默认该服务是存活的,这种方法无法判断僵死的服务;
- 2、接口探测,探测相应的接口,接口正常认为服务正常,这种方法无法判断僵死的服务;
下游服务主动向上游服务发送自己的状态
该探测方式能够判断僵死的服务,当上游接收不到状态的时候,上游会认为服务僵死;
四、降级
一个服务中可能会集成多个功能,当并发量增大的时候,比如双11,可以对服务做降级操作,即关闭一些不重要的功能或者服务,只留重要的功能或者服务对外提供服务。