Java曲线之削峰填谷,Sentinel匀速模式(削峰填谷)
一、什么是削峰填谷:
某瞬时来了大流量的请求, 而如果此时要处理所有请求,很可能会导致系统负载过高,影响稳定性。但其实可能后面几秒之内都没有消息投递,若直接把多余的消息丢掉则没有充分利用系统处理消息的能力。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匀速模式(削峰填谷)相关推荐
- [codeforces 1313C1] Skyscrapers (easy version) 问的是谷,答的是峰
Codeforces Round #622 (Div. 2) 比赛人数5752 [codeforces 1313C1] Skyscrapers (easy version) 问的是谷,答的是峰 ...
- Java 8中的instanceof运算符和访客模式替换
我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTypeOf(msg).is(D ...
- Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式
Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据 读写分离 存在的问题: 手动干预切主等操作 主节点的写能力受到单机限制 ...
- java工作笔记021---Java设计模式_观察者模式_事件驱动模式
技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 这个模式现在,觉得越来越有用了, 发现在一些springCloud项目中也有用的,一些前端,net, 后端java的 ...
- oracle无效的关系运算符_每日一课 | Java 8中的instanceof运算符和访客模式替换
我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长.所以我想出了以下DSL语法: Object msg = //... whenTypeOf(msg). ...
- java图片颜色取反色,照片底片模式
全栈工程师开发手册 (作者:栾鹏) java教程全解 java图片颜色取反色,照片底片模式 测试代码 public static void main(String[] args) {//文件与Buff ...
- Java剑 VS .NET刀 -- 晨袭血战(论模式)(一)【推荐】
夜,黑夜,子时,伸手不见五指,长安城西边凤鸣山山顶,京城原Java剑四大镖局总镖头到了三位:东剑-孙如来,南剑-李震天,西剑-魏东,当年声名显赫的镖局三大当头齐聚此地,必定有天大的事情发生!!只听李震 ...
- Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战
Java用最少代码实现五子棋-玩家对战模式-人机对战模式-电脑策略对战 玩家对战模式 背景说明 代码实现 人机对战模式 背景说明 完整代码实现 电脑根据优势分数对战 背景说明 完整代码实现 小结 玩家 ...
- 龙之谷2微信哪个服务器,龙之谷2微信区
龙之谷2微信区是一款由腾讯出品原班人马打造的龙之谷正统续作动作奇幻RPG手游.找到属于自己的快乐与故事!曾经许下的约定,终于到了实现的时刻,龙之谷再登移动端,超爽快的动作体验,绚丽的技能特效,海量免费 ...
最新文章
- java打印四行等腰三角形_(c语言程序案例.doc
- 感谢有您--我的51CTO【与51CTO的故事】
- ExtJS专题-TreePanel(1)
- Apache Kylin从入门到精通
- 开源︳Quicksilver for Mac(键盘启动工具)V1.6.1免费版
- MTK 驱动(73)--- Kernel Backtrace 无法显示出具体的地址.
- Unity PointCloud开发:Mesh渲染点云
- 每日涉猎技术点存档(2018年6月)
- 什么都不懂的人怎么样可以建立自己的网站
- 海康监控设备如何修改IP地址
- 全球与中国弹簧探针市场深度研究分析报告(2022)
- Linux的du命令
- 关于IDM的使用相关教程
- IT售前工程师需要掌握哪些技术
- win11浏览器默认主页如何设置
- 选择代码覆盖工具的 10 个标准
- 【control】微分平坦(Differential Flatness)
- 如何玩转短视频提升影响力?
- 2022.12.22 c词汇背诵
- lte基站信号测试软件,是德科技TD-LTE基站性能测试方案