前面几篇我们讲了隔离设计,令牌桶算法,漏桶算法,自适应限流和断路器,可用性的构建远不止于此那,这部分内容也是在进阶训练营里教了7个小时。如果对其他部分感兴趣,建议购买源码课程观看。由于之前的文章大多都是关于限流的,所以我们来看看不同限流方式的对比。限流和微服务可用性设计。提到的一些内容总结了可用性应该怎么做。微服务可用性设计总结如上图所示,我们从一个简单的用户接入入手。用户通常先通过我们的手机客户端或浏览器访问我们的服务,然后依次通过CDN、防火墙、API网关进行请求。、BFF和各种后台服务,整个链路还是比较长的。我们上图其实部分体现了隔离设计,后面就不提了。1、移动客户端/浏览器客户端是接触用户的第一线,所以这一层的易用性优化尤为重要。降级:降级的本质是给用户提供有害的服务,所以第一行触及用户如何安抚或者欺骗用户的眼睛尤为重要本地缓存,客户端需要有一些本地缓存数据,不仅可以提速用户首屏的加载时间,还可以在后台服务失败时播放一定的缓冲降级数据兼容。有时服务器会返回一些模拟数据或空数据用于降级。这些数据必须与客户端良好连接。如果连接不好,很容易导致异常或白屏流控:当服务出现问题时,用户总是会主动尝试不断重试。如果没有限制,会让我们本已不堪重负的后端服务雪上加霜。因此,我们需要在客户端实现类似熔断的流控措施。共同的想法是指数级的。让步,或者通过服务器的回归获得冷却时间。2、BFF/ClientBFF是我们后端服务的桥头堡。当请求来到BFF层时,BFF既是服务端又是客户端,因为它一般需要大量的请求其他后端服务用于完成数据整理,提供客户端想要的数据超时控制:超时控制需要注意的两点是默认值和超时下发的默认值。基础库需要有一些默认值,避免客户端用户漏填,填错,比如开发填写一个明显偏大的值100s才超时,这时候我们的基础库可以直接抛出错误,也可以警告手动忽略才能正常启动。之前有一个应用因为忘记配置超时时间,导致依赖的服务挂了,导致我的服务无法正常服务。即使之前做了缓存也没用,因为之前的逻辑是请求报错才会降级缓存。数据。超时传输,比如上图中,假设我们整个请求的超时时间配置为500ms,BFF经过一些逻辑判断后先消耗100ms,然后请求redis。我们给redis配置的超时时间max_con是500ms,这个时候不能用500ms作为超时时间,我们只好用min(请求剩余的超时时间,max_con),也就是400ms,作为我们的超时时间.同样,我们在请求下游服务时,也需要将超时时间携带到头部信息中,这样下游服务就可以继承上游的超时时间,用于超时判断。负载均衡:一般我们常用的负载均衡策略是轮训,或者加一个权重。最大的问题是每个实例的服务性能都不一样。接收宿主机的型号和当前机器上的服务受实例数量等因素的影响,而且由于我们的服务随时都在漂移和变化,我们没有办法给每个实例分配合适的权重。因此,我们可以根据一些统计数据获取当前服务的负载情况,比如cpu、负载等信息,然后根据不同的负载情况进行打分,进而进行流量分配,这样就可以合理分配我们的流量给每个例子上来。重试:重试一定要小心,避免雪崩。当我们的服务出现一些错误时,我们可以通过重试来解决。比如有些实例过载,请求慢了,我们可以重试,把上面的负载均衡请求发给正常的实例,这样可以提高我们的SLA。但是需要注意的是,重试只能在出错的地方重试,不允许级联重试。级联重试很容易导致雪崩。一般来说,方法是约定一个代码。只要出现这段代码,我们就知道下游已经尝试重试了,我们不想再重试了。可以解决,但是如果服务整体出现问题,作为client,需要使用熔断措施。常见的熔断器有开、闭、半开三种状态,比如hystrix-go的实现,但是这种方式比较死板。只要触发熔断,任何请求都不能放过,于是又学习了谷歌SRE。同时该结构计算概率来做出判断。没有半开状态,打开也不会说是一刀切。降级:当我们请求一些不太重要的服务出现错误时,我们可以通过降级的方式返回请求。降级一般在BFF层进行,可以有效防止其他服务的缓存被污染。常见的讨论有返回mock数据、缓存数据、空数据等。3.ServerBFF其实是一个服务器,但是为了解释顺畅,主要是作为客户端使用。服务器端主要是限流措施。当流量从BFF来到我们的服务时,我们会使用令牌桶算法来尝试获取令牌。如果令牌不够,我们将丢弃它。如果令牌足够,我们将完成请求逻辑。我们的代币从哪里来?拦截器会定期向TokenServer上报心跳数据,包括一些统计信息,同时从TokenServer获取一定数量的Token。TokenServer收到请求后,会通过最大和最小公平共享算法,根据各个服务实例上报的统计信息分配Token。这其实就是之前没有提到的分布式限流的思想。在单个服务实例上使用单机限流算法,在这里总结一下我们易用性相关的知识点。就算告一段落了,上一篇主要讲解了限流的相关知识点,其他的虽然没有详述,但是这篇总结也算是全部涉及到,包括隔离设计,限流(单机限流,自适应限流、分布式限流)、超时控制、降级、断路器、负载均衡、重试。OK,话不多说,下篇文章见。本文转载自微信公众号「mohuishou」,可关注下方二维码。转载本文请联系mohuishou公众号。
