正文
今天在学习的过程中,突然发现背压(back-pressure)。这是什么?流控(flow control)又是什么?
实际上,背压是实现流控的一种途径,或者是方法之一,实现流控的方法有很多。下面进行一一说明:(1)背压(back-pressure):就是消费者需要多少,生产者就生产多少。这有点类似于TCP里的流量控制,接收方根据自己的接收窗口的情况来控制接收速率,并通过反向的ACK包来控制发送方的发送速率。它主要的实现的是从服务的订阅端告诉服务的提供者自己的消费的能力。(2)节流(Throttling):也就是直接丢弃用户的请求。如果服务消费者消费不过来,就要丢弃用户的一些请求。具体的如何丢弃也有一些策略,就像Java中的线程池中的拒绝策略类似。(3)打包(buffer和window)。buffer和window基本一样,只是输出格式不太一样。它们是把上游多个小包裹打成大包裹,分发到下游。我更愿称为可以进行批量的请求。比如,用户的请求到某个服务的时候,可以等待一定量的请求,然后处理这些请求,进行批量的处理,防止大量的用户请求都直接请求到后端,使后端服务不可用,造成阻塞。(4)最后一种就是排队,也就是服务提供方针对用户的请求进行排队,然后,服务提供者一一消费用户的请求服务。但是这样做势必会造成用户等待的时间增加。流控,顾名思义,就是流量控制。它的主要的目的就是实现服务提供者与服务消费者之间的关系。防止出现过多的请求,导致整体的服务无法对外提供优质的服务。实际上实现流控的并不仅仅是这些,例如Nginx里面的算法,漏斗算法、令牌算法、隔板等等技术都是可以实现的。
今天背压的这种概念,从Spring5中的WebFlux了解到。WebFlux与我们平时使用的SpringMVC是差不多的,但是它最主要的优势是采用Reactor的方式处理用户的请求,提供非阻塞的请求。同时支持函数式编程,下面的图片是具体的介绍:
同时,它也支持多种的部署方式,可以部署在不同的容器中
因为它实现的是NIO的方式,那么它就需要在Servlet3.1以上的支持NIO的容器中进行使用。这个技术还是有很多没有了解的地方,自己还要深入的了解。作者才疏学浅,如果不正确的地方,欢迎各位批评指正互相学习。