在应对秒杀、大促、双 11、618 等高性能压力的场景时,限流已经成为了标配技术解决方案,为保证系统的平稳运行起到了关键性的作用。不管应用场景是哪种,限流无非就是针对超过预期的流量,通过预先设定的限流规则选择性的对某些请求进行限流“熔断”。

1. 限流

  1.1 单机限流

    a>>限制并发量

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;public class SemaphoreTest {private static final int THREAD_COUNT = 30;private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT);private static Semaphore s = new Semaphore(10);public static void main(String[] args) {for (int i = 0; i < THREAD_COUNT; i++) {threadPool.execute(new Runnable() {@Overridepublic void run() {try {s.acquire();System.out.println(Thread.currentThread().getName());Thread.sleep(5000);System.out.println("--------------");s.release();} catch (InterruptedException e) {}}});}threadPool.shutdown();}
}

    b>>计数器,以CountDownLatch为例

import java.util.concurrent.CountDownLatch;public class CountDownLatchTest2 {public static void main(String[] args) {// 创建计数器,初始化为2final CountDownLatch latch = new CountDownLatch(2);new Thread(() -> {try {System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");Thread.sleep(3000);System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");latch.countDown();// 减一} catch (InterruptedException e) {e.printStackTrace();}}).start();new Thread(() -> {try {System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");Thread.sleep(3000);System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");latch.countDown();} catch (InterruptedException e) {e.printStackTrace();}}).start();try {System.out.println("等待2个子线程执行完毕...");// 阻塞
            latch.await();System.out.println("2个子线程已经执行完毕");System.out.println("继续执行主线程");} catch (InterruptedException e) {e.printStackTrace();}}
}

c>>guava RateLimiter    

public void test()
{/*** 创建一个限流器,设置每秒放置的令牌数:2个。速率是每秒可以2个的消息。* 返回的RateLimiter对象可以保证1秒内不会给超过2个令牌,并且是固定速率的放置。达到平滑输出的效果*/RateLimiter r = RateLimiter.create(2);while (true){/*** acquire()获取一个令牌,并且返回这个获取这个令牌所需要的时间。如果桶里没有令牌则等待,直到有令牌。* acquire(N)可以获取多个令牌。*/System.out.println(r.acquire());}
}

1.2 分布式限流

a>> nginx

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { location / { limit_req zone=mylimit;
    }
}

b>>api-gateway+redis限流

https://github.com/wangzheng0822/ratelimiter4j

2. 熔断对比

功能对比

  Sentinel Hystrix resilience4j
隔离策略 信号量隔离(并发线程数限流) 线程池隔离/信号量隔离 信号量隔离
熔断降级策略 基于响应时间、异常比率、异常数 基于异常比率 基于异常比率、响应时间
实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于 RxJava) Ring Bit Buffer
动态规则配置 支持多种数据源 支持多种数据源 有限支持
扩展性 多个扩展点 插件的形式 接口的形式
基于注解的支持 支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 有限的支持 Rate Limiter
流量整形 支持预热模式、匀速器模式、预热排队模式 不支持 简单的 Rate Limiter 模式
系统自适应保护 支持 不支持 不支持
控制台 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 简单的监控查看 不提供控制台,可对接其它监控系统

参考文献:

【1】https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2651008444&idx=1&sn=a579c3ceb143ea30930bd4c6d4a8d7e2&chksm=bdbed5ef8ac95cf93e71c5393f08e3b97a7e19e8232ce3872231f2cae74f7a19ab15501aeb44&scene=27#wechat_redirect

【2】https://mp.weixin.qq.com/s?__biz=MzIwMzY1OTU1NQ==&mid=2247484306&idx=1&sn=b6c1b7b9d7c57bbb9f82ec451bcda867&chksm=96cd43dea1bacac8a24cde429146f69dba8bb15c5c9c3fe9adfe858d9a4349cc127fbfa84a8c&scene=27#wechat_redirect

【3】https://github.com/alibaba/Sentinel/wiki/Guideline:-%E4%BB%8E-Hystrix-%E8%BF%81%E7%A7%BB%E5%88%B0-Sentinel

转载于:https://www.cnblogs.com/davidwang456/p/10196191.html

分布式系统中的限流与熔断相关推荐

  1. 高并发中的 限流、熔断、降级、预热、背压你都知道是什么意思吗?

    首先,我们需要明确一下这几个名词出现的场景:分布式高并发环境.如果你的产品卖相不好,没人鸟它,那它就用不着这几个属性.不需要任何加成,低并发系统就能工作的很好. 分布式系统是一个整体,调用关系错综复杂 ...

  2. 10张图带你彻底搞懂什么是限流、熔断、服务降级

    在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽.这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩. ...

  3. 12张图带你彻底搞懂服务限流、熔断、降级、雪崩

    目录 一.服务雪崩 二.服务限流 1.限流指标 1)TPS 2)HPS 3)QPS 2.限流方法 1)流量计数器 2)滑动时间窗口 3)漏桶算法 4)令牌桶算法 5)分布式限流 6)hystrix限流 ...

  4. Sentinel Dubbo 适配器看限流与熔断(实战思考篇)

    本文是源码分析 Sentinel 系列的第十三篇,已经非常详细的介绍了 Sentinel 的架构体系.滑动窗口.调用链上下文.限流.熔断的实现原理,相信各位读者朋友们对Sentinel有一个较为体系化 ...

  5. Spring Cloud Alibaba 系统保护 - 限流与熔断:Sentinel 在项目中的最佳实践

    上一讲我们讲解了微服务的雪崩效应与如何基于 Sentinel 实现初步微服务限流,掌握了部署 Sentinel Dashboard与配置 Sentinel Core 客户端的技巧.本讲咱们继续 Sen ...

  6. SpringCloud Alibaba 实战之《限流与熔断:Sentinel 在项目中的最佳实践》

    上一讲我们讲解了微服务的雪崩效应与如何基于 Sentinel 实现初步微服务限流,掌握了部署 Sentinel Dashboard与配置 Sentinel Core 客户端的技巧.本讲咱们继续 Sen ...

  7. Spirng Cloud 中gateway 网关限流和熔断

    分流:原先数据库只放一个服务器,无论多少个都只能访问这个服务器,访问不了就排队(延迟)(如果同一时间也高并发了那就限流) 限流:同一时间限制访问的人数 限流的算法 漏桶算法:把请求放到一个容器中,控制 ...

  8. Alibaba Sentinel 限流与熔断初探

    在学习一个新技术或新框架时,建议先查看其官方文档,以获得对其形成一个整体的认识.https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D ...

  9. Alibaba Sentinel 限流与熔断初探(技巧篇)

    温馨提示:源码分析 Alibaba Sentinel 专栏开始连载,本文展示如何学习一个全新的技术的方法.该专栏基于 1.7.0 版本. 在学习一个新技术或新框架时,建议先查看其官方文档, Senti ...

最新文章

  1. Swift 泛型函数补充
  2. [CareerCup] 9.5 Permutations 全排列
  3. jetty 在请求URI里传入非法字符,jetty会断开连接,导致nginx认为该节点不健康
  4. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析
  5. 记sentinel里防止多并发下读取脏数据的操作
  6. [转]Global exception handling in Web API 2.1 and NLog
  7. js字符串string转object对象 - 方法篇
  8. Java总结基础知识
  9. java不规则数组杨辉,JAVASE课程 第一章 第三讲程序控制与数组
  10. 如何利用Django打造一款类似于链家二手房信息查询网!厉害吧!
  11. 如何在宝贝描述里加旺旺图标和免费电话
  12. matlab最小二乘法解超定方程,超定方程和最小二乘法
  13. 基于python使用CV裁剪图片
  14. 网络爬虫——前程无忧网数据获取及MYSQL存储
  15. RHCE第一讲【II】
  16. 12.3 文本查询程序
  17. 2013驾考科目一理论知识重点归纳
  18. 100多个新媒体人实用网站
  19. GSoC: GitHub Checks API 项目第三阶段总结
  20. 吉林大学软件学院——UML作业1

热门文章

  1. 标题 穿越雷区 java_【蓝桥杯】穿越雷区-java语言描述
  2. 30充电宝多少毫安_10000毫安充电宝品牌排行?2020年高性价比10000mAh移动电源推荐...
  3. android 共享数据,android进程间共享简单数据
  4. matlab求一个方程组的系数矩阵,【求解】matlab求解非齐次方程组,但是系数矩阵是复数,求帮忙...
  5. 树莓派python编程小车_python3实现网页版raspberry pi(树莓派)小车控制
  6. java语言修饰符$_Java语言中的修饰符
  7. android 判断按钮是否已经有onclicklinstener,通过点击事件监听setOnClickListener彻底理解回调...
  8. java自己写一个上下文_5.自己动手写Java Web框架-上下文
  9. kylin linux 安装教程,新手入门必备:kylin安装教程介绍!
  10. 采用 facebook 的prophet 预测科大讯飞的股票开盘价