网站建设功能定位怎么写,外贸怎么做站外推广,国外被动收入网站做的好的,中国新产品招商网文章目录 一、限流1.1 常见限流方式1.1.1 固定窗口、滑动窗口、漏斗、令牌桶1.1.2 令牌桶限流原理-公式 1.2Guava令牌桶使用方式1.3 其他限流流控规则配置阻塞类型突发流量限流并且拒绝流量请求#xff0c;友好提示限流了 二、 熔断1.1 Thfirt熔断器 三、 线程池隔离3.1 背景3… 文章目录 一、限流1.1 常见限流方式1.1.1 固定窗口、滑动窗口、漏斗、令牌桶1.1.2 令牌桶限流原理-公式 1.2Guava令牌桶使用方式1.3 其他限流流控规则配置阻塞类型突发流量限流并且拒绝流量请求友好提示限流了 二、 熔断1.1 Thfirt熔断器 三、 线程池隔离3.1 背景3.2 使用 一、限流
1.1 常见限流方式
1.1.1 固定窗口、滑动窗口、漏斗、令牌桶
四种常见限流方式
1.1.2 令牌桶限流原理-公式
令牌桶
1.2Guava令牌桶使用方式
Guava-RateLimiter
1.3 其他限流
流控规则配置
集群非精确 720次/s (限流周期1s、限流次数720)、阻塞类型不限时阻塞 突发流量1s(缓存一定时间的阈值应对流量蜂刺)、返回码429、返回信息导出查询接口被限流
补充详解策略
序号策略类型含义备注极端场景1集群非精确限流限流策略5s/一个请求。5台机器平均每个机器0.2个请求/s令牌是会先通过当前的再阻塞未来的所以限流不准用户A和B同一时刻或者5s之内两次访问请求都可以打进去接口2集群精确限流1.0限流策略5s/一个请求 即整个集群5s内只允许通过一个请求5s内整个集群只会通过1次请求
阻塞类型
序号策略类型使用场景极端场景备注1限时阻塞集群非精确限流2不限时阻塞会阻塞线程100qps5台机器。每台处理20QPS300请求打过来极端场景全部打到同一个机器A。A1s只能处理20请求300请求需要15s也就是最后一个线程可能等待15s才能获得令牌执行线程因为限流线程等待了近10s
突发流量
1、定义
在突发模式中Guava限流器的桶中令牌是有一个有效期的有效期的作用是让限流器具有一定的“弹性”可以根据空闲情况临时超额放行一些请求用于平滑处理突发流量。
2、设置值1
即保留上1s内剩下的所有令牌。给下一秒用。
eg1s生产100令牌。12:00:00没有请求进来12:00:01的时候现有可用令牌数量 本秒的100 上一秒的100 200。所以即时限制了100QPS在12:00:01的时候也可能有200个请求打进来
踩坑1 使用限流器后实际流量总是超过配置阈值
**解释**这种情况只可能发生下突发模式下是由2.3小节中介绍的突发流量处理机制导致的。突发模式限流器在向请求发放令牌包括存量令牌与新令牌新令牌的生成速度等于限流速度而超额部分的请求来自于存量令牌。在实际流量超过阈值不多的情况下令牌桶中的令牌需要很长时间才能被耗尽。
踩坑2在客户端匀速调用的场景中服务端使用了限流器后发现实际流量无法达到阈值上限【很少见】
**解释**这种情况是非常偶然的实际是由于限流配置不当导致的。假设某个客户端以50QPS的速度发出请求即每20ms一个服务端的限流器配置为30QPS且不支持突发流量突发模式下设置突发时间为0或者使用了预热模式。这种情况下服务端会严格按照每30ms一个的速度接收请求因此客户端在20ms之后发出第二个请求时服务端尚未满足30ms的间隔时间就出现了每两个请求就有一个被拒绝的现象。读者可参考下图理解这一现象。
**建议**在遇到这种问题时首先考虑限流阈值是否合理。其次如果在服务端使用突发模式限流尽量不要把突发时间maxBrustSeconds设置为0。如果使用预热模式限流应该参考服务容量配置一个足够大的限流阈值。
限流并且拒绝流量请求友好提示限流了
自定义blockHandle处理方法
方法的入参和出参 和 限流方法的一致 public ExportDataTResponse blockHandler(SkuPreSellTRequest request, Operator operator) {LOGGER.info(限流导出request:{}, operator:{}, GsonUtil.toJsonString(request), GsonUtil.toJsonString(operator));ExportDataTResponse response new ExportDataTResponse();response.setCode(429);response.setMsg(String.format(当前有用户正在操作导出请 3 s后重试);response.setData();return response;}二、 熔断
1.1 Thfirt熔断器
1、默认配置
请求试探窗口5s(心跳机制)恢复策略正常(立即、限时)降级方法自定义降级方法(返回常量、抛出异常、脚本) Degrade(key 自定义key, fallBackMethod fallBack)public int getPrice(int param) {//方法内部不要捕获异常熔断器通过异常判断调用结果int n random.nextInt(10000);int m 1;if (n 9900) {m 1 / 0;}return m;}// 降级方法参数和主方法保持一致注意降级方法必须是public否则无法被cglib代理增强public int fallBack(int param) {return 0;}统计窗口10s请求总数20失败率50%失败数2
三、 线程池隔离
3.1 背景
如果某个接口的QPS过高可能会影响服务提供其他功能接口。因为thrift单机默认256个工作线程如果某接口的性能不好QPS又高则某个时间点工作线程可能都被这个接口占用了导致其他接口不可用。这时候我们就可以使用线程池隔离动态的给这个接口分配线程池。当超过一定的工作线程则采用拒绝策略或直接抛出异常再结合熔断降级方法10s内20次调用超过50%的失败率则这个接口会被降级调用降级方法fallbackMethod。然后5s之后心跳机制会去验证这个接口是否恢复正常如果恢复正常则接口限时|正常 节奏恢复可用否则再等5s
3.2 使用
线程池隔离 降级熔断方法同理限流也可以接口熔断降级方法一起使用
ThreadPoolExecute(key method.querySkuStock, coreSize 15, maxSize 30, maxQueueSize 500, rejectHandler ThreadPoolExecutor.CallerRunsPolicy.class)
Degrade(rhinoKey asyncMethod, fallBackMethod fallbackMethod)
public FutureString asyncMethod() {return new AsyncResultString() {Overridepublic String invoke() throws Exception {TimeUnit.MILLISECONDS.sleep(500);return asyncMethod;}};
}public String fallbackMethod(Throwable e) {//do fallback businessreturn fallback;
}