一、什么是削峰填谷:

某瞬时来了大流量的请求, 而如果此时要处理所有请求,很可能会导致系统负载过高,影响稳定性。但其实可能后面几秒之内都没有消息投递,若直接把多余的消息丢掉则没有充分利用系统处理消息的能力。Sentinel的Rate Limiter模式能在某一段时间间隔内以匀速方式处理这样的请求, 充分利用系统的处理能力, 也就是削峰填谷, 保证资源的稳定性.

Sentinel会以固定的间隔时间让请求通过, 访问资源。当请求到来的时候,如果当前请求距离上个通过的请求通过的时间间隔不小于预设值,则让当前请求通过;否则,计算当前请求的预期通过时间,如果该请求的预期通过时间小于规则预设的 timeout 时间,则该请求会等待直到预设时间到来通过;反之,则马上抛出阻塞异常。

使用Sentinel的这种策略, 简单点说, 就是使用一个时间段(比如20s的时间)处理某一瞬时产生的大量请求, 起到一个削峰填谷的作用, 从而充分利用系统的处理能力, 下图能很形象的展示这种场景: X轴代表时间, Y轴代表系统处理的请求.

image.png

二、验证

模拟1000个请求同时并发的访问资源, 这1000个请求, 如果设置QPS阈值为100, 按照默认sentinel默认的RuleConstant.CONTROL_BEHAVIOR_DEFAULT拒绝策略, 那么剩余的900个请求会被立即直接拒绝掉, 抛出BlockException.

image.png

image.png

image.png

同样是模拟1000个请求同时并发访问资源, 同样设置QPS阈值100, 但是拒绝策略修改为Rate Limiter匀速RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER方式, 还需要设置setMaxQueueingTimeMs(20 * 1000)表示每一请求最长等待时间, 这里等待时间大一点, 以保证让所有请求都能正常通过。

假设这里设置的排队等待时间过小的话, 导致排队等待的请求超时而抛出异常BlockException, 最终结果可能是这1000个并发请求中只有几个请求或几十个才能正常通过, 所以使用这种模式得根据访问资源的耗时时间决定排队等待时间。

按照目前这种设置, QPS阈值为100的话, 每一个请求相当于是以匀速10ms左右通过。

@GetMapping("/paceFlow")

public void paceFlow() throws InterruptedException{

System.out.println("pace behavior");

countDown = new CountDownLatch(1);

// queuing队列方式, 匀速处理流量

initPaceFlowRule();

// 直接并发同时启动1000个线程, 模拟1000个并发请求资源

simulatePulseFlow();

countDown.await();

System.out.println("done");

System.out.println("total pass:" + pass.get() + ", total block:" + block.get());

System.out.println();

}

匀速模式的规则

private static void initPaceFlowRule() {

List rules = new ArrayList<>();

FlowRule rule1 = new FlowRule();

rule1.setResource(KEY);

rule1.setCount(count);

rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);

rule1.setLimitApp("default");

/*

* CONTROL_BEHAVIOR_RATE_LIMITER means requests more than threshold will be queueing in the queue, until the

* queueing time is more than {@link FlowRule#maxQueueingTimeMs}, the requests will be rejected.

*/

rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);

// 这里设置的等待处理时间较大, 让系统能平稳的处理所有的请求

rule1.setMaxQueueingTimeMs(20 * 1000);// 表示每一个请求的最长等待时间20s

rules.add(rule1);

FlowRuleManager.loadRules(rules);

}

并发启动1000线程模拟请求

private static void simulatePulseFlow() {

for (int i = 0; i < requestQps; i++) {

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

long startTime = TimeUtil.currentTimeMillis();

Entry entry = null;

try {

entry = SphU.entry(KEY);

pass.incrementAndGet();

} catch (BlockException e1) {

System.out.println("===>BlockException");

block.incrementAndGet();

} catch (Exception e2) {

// biz exception

} finally {

if (entry != null) {

entry.exit();

// pass.incrementAndGet();

long cost = TimeUtil.currentTimeMillis() - startTime;

System.out.println(TimeUtil.currentTimeMillis() + " one request pass, cost " + cost

+ " ms");

}

}

try {

TimeUnit.MILLISECONDS.sleep(5);

} catch (InterruptedException e1) {

// ignore

}

if (done.incrementAndGet() >= requestQps) {

countDown.countDown();

}

}

}, "Thread " + i);

thread.start();

}

}

启动后控制台打印:

image.png

可以看到pass:1000,block:0,可以看到在阔值设定为100,匀速模式下仍可以全部通过,实现了削峰填谷。

sentinel控制台展示效果图:

image.png

可以看到由于阔值是100,而模拟请求是1000,通过的qps就是100,匀速通过直到全部pass。

还可以在控制台看到代码所限定的流控规则:

image.png

Java曲线之削峰填谷,Sentinel匀速模式(削峰填谷)相关推荐

  1. [codeforces 1313C1] Skyscrapers (easy version) 问的是谷,答的是峰

    Codeforces Round #622 (Div. 2)   比赛人数5752 [codeforces 1313C1] Skyscrapers (easy version)   问的是谷,答的是峰 ...

  2. Java 8中的instanceof运算符和访客模式替换

    我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTypeOf(msg).is(D ...

  3. Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

    Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据 读写分离 存在的问题: 手动干预切主等操作 主节点的写能力受到单机限制 ...

  4. java工作笔记021---Java设计模式_观察者模式_事件驱动模式

    技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 这个模式现在,觉得越来越有用了, 发现在一些springCloud项目中也有用的,一些前端,net, 后端java的 ...

  5. oracle无效的关系运算符_每日一课 | Java 8中的instanceof运算符和访客模式替换

    我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长.所以我想出了以下DSL语法: Object msg = //... whenTypeOf(msg).     ...

  6. java图片颜色取反色,照片底片模式

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java图片颜色取反色,照片底片模式 测试代码 public static void main(String[] args) {//文件与Buff ...

  7. Java剑 VS .NET刀 -- 晨袭血战(论模式)(一)【推荐】

    夜,黑夜,子时,伸手不见五指,长安城西边凤鸣山山顶,京城原Java剑四大镖局总镖头到了三位:东剑-孙如来,南剑-李震天,西剑-魏东,当年声名显赫的镖局三大当头齐聚此地,必定有天大的事情发生!!只听李震 ...

  8. Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战

    Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战 玩家对战模式 背景说明 代码实现 人机对战模式 背景说明 完整代码实现 电脑根据优势分数对战 背景说明 完整代码实现 小结 玩家 ...

  9. 龙之谷2微信哪个服务器,龙之谷2微信区

    龙之谷2微信区是一款由腾讯出品原班人马打造的龙之谷正统续作动作奇幻RPG手游.找到属于自己的快乐与故事!曾经许下的约定,终于到了实现的时刻,龙之谷再登移动端,超爽快的动作体验,绚丽的技能特效,海量免费 ...

最新文章

  1. java打印四行等腰三角形_(c语言程序案例.doc
  2. 感谢有您--我的51CTO【与51CTO的故事】
  3. ExtJS专题-TreePanel(1)
  4. Apache Kylin从入门到精通
  5. 开源︳Quicksilver for Mac(键盘启动工具)V1.6.1免费版
  6. MTK 驱动(73)--- Kernel Backtrace 无法显示出具体的地址.
  7. Unity PointCloud开发:Mesh渲染点云
  8. 每日涉猎技术点存档(2018年6月)
  9. 什么都不懂的人怎么样可以建立自己的网站
  10. 海康监控设备如何修改IP地址
  11. 全球与中国弹簧探针市场深度研究分析报告(2022)
  12. Linux的du命令
  13. 关于IDM的使用相关教程
  14. IT售前工程师需要掌握哪些技术
  15. win11浏览器默认主页如何设置
  16. 选择代码覆盖工具的 10 个标准
  17. 【control】微分平坦(Differential Flatness)
  18. 如何玩转短视频提升影响力?
  19. 2022.12.22 c词汇背诵
  20. lte基站信号测试软件,是德科技TD-LTE基站性能测试方案

热门文章

  1. 云计算的基本特征,主要有哪些?
  2. 2020年一线城市程序员工资大调查
  3. 计算机课代表专业演讲稿,课代表发言稿优秀范文3篇
  4. 上天、入水、下地,清洁机器人蓝海有多大?
  5. 浙江大学计算机博士申请考核,考博经验 | 2020年浙江大学博士申请考核经验分享...
  6. tsconfig 配置文件各字段详解
  7. 2016年8月24日 星期三 --出埃及记 Exodus 16:25
  8. Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
  9. Echarts - lengend图例自定义
  10. Python的7大就业方向,你知道几个?