一、Sentinel是阿里开源产品,用于流量监控和管理。

二、对于流量控制,可以通过限制线程数和QPS实现限流

1. 资源进入Sentinel的方式

Entry entry = null;
try {
entry = SphU.entry(resourceName, entryType);
Object result = pjp.proceed();
return result;
} catch (BlockException ex) { } catch (Throwable ex) { } finally {
if (entry != null) {
entry.exit();
}
}

Entry对象负责进入和退出的管理,进入后增加线程计数及访问记录,退出后减少线程计数及访问记录。

2. Sentinel是通过一组ProcessorSlot链组成ProcessorSlotChain来责任调用。

public ProcessorSlotChain build() {
ProcessorSlotChain chain = new DefaultProcessorSlotChain();
chain.addLast(new NodeSelectorSlot());
chain.addLast(new ClusterBuilderSlot());
chain.addLast(new LogSlot());
chain.addLast(new StatisticSlot());
chain.addLast(new SystemSlot());
chain.addLast(new AuthoritySlot());
chain.addLast(new FlowSlot());
chain.addLast(new DegradeSlot());
return chain;
}

调用的顺序是:NodeSelectorSlot --> ClusterBuilderSlot --> LogSlot --> SystemSlot --> AuthoritySlot --> FlowSlot --> DegradeSlot --> StatisticSlot

3. 关于线程、QPS、RT的计算

查看StatisticSlot

entry 方法中主要是调用StatisticNode的increaseThreadNum, addPassRequest方法

exit 方法中主要是调用StatisticNode的 rt ,decreaseThreadNum方法

在StatisticNode中,可以看到几个属性:

  两个时间窗口,一个线程计数器

private transient volatile Metric rollingCounterInSecond = new ArrayMetric(1000 / 2,1);
private transient Metric rollingCounterInMinute = new ArrayMetric(1000, 60);
private AtomicInteger curThreadNum = new AtomicInteger(0);

线程计数器很好理解,entry时 根据FlowRule 校验 ,增加该值,exit时减小该值。

QPS就是rollingCounterInSecond当前时间窗口的各QPS计数器值:

  有passQPS , successQPS, blockQPS, exceptionQPS ,totalQPS(passQPS+blockQPS)

平均RT(1s平均响应次数) 是rollingCounterInSecond当前窗口的 RT总值除以 success次数。

  一次RT: exit时的时间值 减去  entry时的时间值。

4. 时间窗口定义(时间单位均为毫秒, / 为整除):

  间隔时间,窗口长度。

  间隔时间 / 窗口长度 ---> 窗口数组长度

  当前时间 / 窗口长度 % 窗口数组长度  ----> 定位到当前窗口

  窗口长度 × (当前时间 / 窗口长度) ----> 当前窗口的起始时间

Sentinel统计线程,QPS,RT的方式的更多相关文章

  1. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  2. ZeroMQ接口函数之 :zmq_inproc – ØMQ 本地进程内(线程间)传输方式

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...

  3. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  4. java 22 - 13 多线程之解决线程安全问题的实现方式2

    上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...

  5. Java创建线程的第二种方式:实现runable接口

    /*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在 ...

  6. 创建线程的两种方式比较Thread VS Runnable

    1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 public class MyThread extends Thread{ @Override public vo ...

  7. Java中创建线程的两种方式

    创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...

  8. Python统计词频的几种方式

    语料 text = """My fellow citizens: I stand here today humbled by the task before us, gr ...

  9. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

随机推荐

  1. Python全栈之路----函数进阶----作用域的查找空间

    n = 10 def func(): n = 20 print('func:',n) def func2(): n = 30 print('func2:',n) def func3(): print( ...

  2. linux下不能拼通www.baidu.com

    1.打开虚拟机,通过命令修改内容如下 vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.将信息修改如下: 3.ping www.baidu.com 查看是否 ...

  3. git创建分支并上传仓库

    1. 新建分支 xxx 2.  git pull (目录下 命令行将线上分支拉倒本地) 3. git checkout xxx (切换到到该分支 ) (可使用 git status 查看目前处于哪一个 ...

  4. iis发布----在XP中发布高版本web遇到问题总结

    解决方法是之前在网上看到的,总结一下. 我在vs2010中做的web网页,放到XP系统中发布是遇到问题,XP中的iis版本是iis. 提示.net framework版本上的问题. 1.在网站属性中把 ...

  5. Docker Compose(八)

    Docker Compose 是Docker官方编排(Orchstration)项目之一,负责快速在集群中部署分布式应用.   Dockerfile可以让用户管理一个单独的应用容器:而Compose则 ...

  6. Window离线环境下如何安装pyhanlp

    Hanlp在离线环境下的安装我是没有尝试过的,分享SunJW_2017的这篇文章就是关于如何在离线环境下安装hanlp的.我们可以一起来学习一下! HanLP是一款优秀的中文自然语言处理工具,可以实现 ...

  7. 20175227张雪莹 2018-2019-2 《Java程序设计》第三周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容总结 (仅在此列举个性化学习总结) 一.编程语言的几个发展阶段. 1.面向机器语言:汇编语言 ...

  8. kubernetes核心组件kube-proxy 学习总结

    一.  kube-proxy 和 service  kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重 ...

  9. 7-安装Spark

    1.Apache Hadoop2.7中的YARN与JAVA8有冲突,如果想要使用spark on yarn,首先需要在yarn-site.xml中配置如下项: <property> < ...

  10. Python(算法)-时间复杂度和空间复杂度

    时间复杂度 算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,时间复杂度常用“O”表述,使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况 时间复杂度是用来估计算法 ...