分布式系统中的限流与熔断
在应对秒杀、大促、双 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
分布式系统中的限流与熔断相关推荐
- 高并发中的 限流、熔断、降级、预热、背压你都知道是什么意思吗?
首先,我们需要明确一下这几个名词出现的场景:分布式高并发环境.如果你的产品卖相不好,没人鸟它,那它就用不着这几个属性.不需要任何加成,低并发系统就能工作的很好. 分布式系统是一个整体,调用关系错综复杂 ...
- 10张图带你彻底搞懂什么是限流、熔断、服务降级
在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽.这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩. ...
- 12张图带你彻底搞懂服务限流、熔断、降级、雪崩
目录 一.服务雪崩 二.服务限流 1.限流指标 1)TPS 2)HPS 3)QPS 2.限流方法 1)流量计数器 2)滑动时间窗口 3)漏桶算法 4)令牌桶算法 5)分布式限流 6)hystrix限流 ...
- Sentinel Dubbo 适配器看限流与熔断(实战思考篇)
本文是源码分析 Sentinel 系列的第十三篇,已经非常详细的介绍了 Sentinel 的架构体系.滑动窗口.调用链上下文.限流.熔断的实现原理,相信各位读者朋友们对Sentinel有一个较为体系化 ...
- Spring Cloud Alibaba 系统保护 - 限流与熔断:Sentinel 在项目中的最佳实践
上一讲我们讲解了微服务的雪崩效应与如何基于 Sentinel 实现初步微服务限流,掌握了部署 Sentinel Dashboard与配置 Sentinel Core 客户端的技巧.本讲咱们继续 Sen ...
- SpringCloud Alibaba 实战之《限流与熔断:Sentinel 在项目中的最佳实践》
上一讲我们讲解了微服务的雪崩效应与如何基于 Sentinel 实现初步微服务限流,掌握了部署 Sentinel Dashboard与配置 Sentinel Core 客户端的技巧.本讲咱们继续 Sen ...
- Spirng Cloud 中gateway 网关限流和熔断
分流:原先数据库只放一个服务器,无论多少个都只能访问这个服务器,访问不了就排队(延迟)(如果同一时间也高并发了那就限流) 限流:同一时间限制访问的人数 限流的算法 漏桶算法:把请求放到一个容器中,控制 ...
- Alibaba Sentinel 限流与熔断初探
在学习一个新技术或新框架时,建议先查看其官方文档,以获得对其形成一个整体的认识.https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D ...
- Alibaba Sentinel 限流与熔断初探(技巧篇)
温馨提示:源码分析 Alibaba Sentinel 专栏开始连载,本文展示如何学习一个全新的技术的方法.该专栏基于 1.7.0 版本. 在学习一个新技术或新框架时,建议先查看其官方文档, Senti ...
最新文章
- Swift 泛型函数补充
- [CareerCup] 9.5 Permutations 全排列
- jetty 在请求URI里传入非法字符,jetty会断开连接,导致nginx认为该节点不健康
- [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析
- 记sentinel里防止多并发下读取脏数据的操作
- [转]Global exception handling in Web API 2.1 and NLog
- js字符串string转object对象 - 方法篇
- Java总结基础知识
- java不规则数组杨辉,JAVASE课程 第一章 第三讲程序控制与数组
- 如何利用Django打造一款类似于链家二手房信息查询网!厉害吧!
- 如何在宝贝描述里加旺旺图标和免费电话
- matlab最小二乘法解超定方程,超定方程和最小二乘法
- 基于python使用CV裁剪图片
- 网络爬虫——前程无忧网数据获取及MYSQL存储
- RHCE第一讲【II】
- 12.3 文本查询程序
- 2013驾考科目一理论知识重点归纳
- 100多个新媒体人实用网站
- GSoC: GitHub Checks API 项目第三阶段总结
- 吉林大学软件学院——UML作业1
热门文章
- 标题 穿越雷区 java_【蓝桥杯】穿越雷区-java语言描述
- 30充电宝多少毫安_10000毫安充电宝品牌排行?2020年高性价比10000mAh移动电源推荐...
- android 共享数据,android进程间共享简单数据
- matlab求一个方程组的系数矩阵,【求解】matlab求解非齐次方程组,但是系数矩阵是复数,求帮忙...
- 树莓派python编程小车_python3实现网页版raspberry pi(树莓派)小车控制
- java语言修饰符$_Java语言中的修饰符
- android 判断按钮是否已经有onclicklinstener,通过点击事件监听setOnClickListener彻底理解回调...
- java自己写一个上下文_5.自己动手写Java Web框架-上下文
- kylin linux 安装教程,新手入门必备:kylin安装教程介绍!
- 采用 facebook 的prophet 预测科大讯飞的股票开盘价