• sentinel备忘


    git https://github.com/alibaba/Sentinel   https://github.com/dubbo/dubbo-sentinel-support
    dubbo http://dubbo.incubator.apache.org/zh-cn/index.html
    wiki https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5
    介绍 https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
    启动配置项 https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9
    Wanted: Who is using Sentinel https://github.com/alibaba/Sentinel/issues/18
    开贡献指南源 https://github.com/alibaba/Sentinel/wiki/%E5%BC%80%E6%BA%90%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97

    Sentinel: Dubbo 服务的流量哨兵 http://dubbo.incubator.apache.org/zh-cn/blog/sentinel-introduction-for-dubbo.html

    官方blog https://github.com/alibaba/Sentinel/wiki/相关-Blog

    https://github.com/alibaba/sentinel-awesome

    https://github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel-控制台

    纠错
    http://dubbo.incubator.apache.org/zh-cn/blog/sentinel-introduction-for-dubbo.html
    一种用书状结构展示资源的调用链路=>树状

    https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
    private static void initDegradeRule() {
    List<SystemRule> rules = new ArrayList<>();
    SystemRule rule = new SystemRule();
    rule.setHighestSystemLoad(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
    }

    DegradeRuleManager.loadRules(rules);=》SystemRuleManager.loadRules(rules);

    提问
    1.QPS 模式的限流,当每秒的请求量超过设定的阈值时会自动拒绝请求 跟 dubbo线程池满抛异常,也相当于拒绝了请求,这种线程池满抛异常是否也达到了目标?

    查询更改规则
    运行下面命令,则会返回现有生效的规则:

    curl http://localhost:8719/getRules?type=<XXXX>
    其中,type=flow 以 JSON 格式返回现有的限流规则;degrade 则返回现有生效的降级规则列表;system 则返回系统保护规则。

    同时也可以通过下面命令来修改已有规则:

    curl http://localhost:8719/setRules?type=<XXXX>&data=<DATA>
    其中,type 可以输入 flow、degrade 等方式来制定更改的规则种类,data 则是对应的 JSON 格式的规则。

    定制自己的持久化规则
    上面的规则配置,都是存在内存中的。即如果应用重启,这个规则就会失效。因此我们提供了开放的接口,您可以通过实现 DataSource 接口的方式,来自定义规则的存储数据源。通常我们的建议有:

    整合动态配置系统,如 etcd、Nacos,动态地实时刷新配置规则
    结合 DB、VCS 等来实现该规则
    配合 Sentinel Dashboard 使用
    更多详情请参考动态规则配置。

    规则生效的效果
    除了在业务代码逻辑上看到规则生效,我们也可以通过下面简单的方法,来校验规则生效的效果:

    暴露的HTTP接口:通过运行下面命令 curl http://localhost:8719/cnode?id=<资源名称>,观察返回的数据。如果规则生效,在返回的数据栏中的 block 以及 block(m) 中会有显示
    日志:Sentinel 提供秒级的资源运行日志以及限流日志,详情可以参考: 日志

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    https://github.com/kimmking/activemq-sentinel-demo

    sentinel-demo-dubbo的两个例子:
    demo1流控规则(QPS)配在provider端,consumer端捕获到的Exception是RpcException;
    demo2流控规则(Thread)配在consumer端,consumer端捕获到的是SentinelRpcException;

    -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=demo-provider
    先启FooProviderBootstrap,再启FooConsumerBootstrap

    [
    {
    "resource": "com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)",
    "controlBehavior": 0,
    "count": 12.0,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
    }
    ]

    [
    {
    "resource": "five",
    "controlBehavior": 2,
    "count": 100,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
    }
    ]

    private void initFlowControlRule(String resource) {

            if (ruleMap.containsKey(resource)) {

                return;

            }

            FlowRule rule = new FlowRule();

            rule.setResource(resource);

            // Indicates the interval between two adjacent requests is 200 ms.

            rule.setCount(20);

            rule.setGrade(RuleConstant.FLOW_GRADE_QPS);

            rule.setLimitApp("default");

            // Enable rate limiting (uniform). This can ensure fixed intervals between two adjacent calls.

            // In this example, intervals between two incoming calls (message consumption) will be 200 ms constantly.

    //        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);

            rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);

            // If more requests are coming, they'll be put into the waiting queue.

            // The queue has a queueing timeout. Requests that may exceed the timeout will be immediately blocked.

            // In this example, the max timeout is 5s.

            rule.setMaxQueueingTimeMs(500 * 1000);

            FlowRuleManager.loadRules(Collections.singletonList(rule));

        }

    //        final String remoteAddress = "127.0.0.1:2181";

    //        final String path = "/Sentinel-Demo/SYSTEM-CODE-DEMO-FLOW";

    //

    //        DataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path,

    //                source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));

    //        FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

    //        final String remoteAddress = "127.0.0.1:2181";
    // final String path = "/Sentinel-Demo/SYSTEM-CODE-DEMO-FLOW";
    //
    // DataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path,
    // source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
    // FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

    //        String key = messageSend.getDestination().getQualifiedName();
    String key = messageSend.getDestination().getPhysicalName();
    
    

    [{"controlBehavior":2,"count":2000.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500000,"resource":"five_send","strategy":0,"warmUpPeriodSec":10}
    ,{"controlBehavior":1,"count":333.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500000,"resource":"one_send","strategy":0,"warmUpPeriodSec":10}
    ,{"controlBehavior":2,"count":2000.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500000,"resource":"five_receive","strategy":0,"warmUpPeriodSec":10} ]


    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1.InitExecutor.doInit();是否需要在初始化时手工调用
    => 不需要,sentinel-core包的
    Env类通过static块调用了;
    demo工程中的InitExecutor.doInit();是为了不让进程退出。

    2.InitExecutor.doInit();已调用,但通过http访问规则失败
    => 检查是否缺少sentinel-transport-simple-http依赖,InitExecutor.doInit()中的ServiceLoader.load(InitFunc.class)加载需要。

    3.在程序中加入sentinel的埋点,如果不配规则的话有没有什么副作用

      没有 这就是我们鼓励的做法
      写代码的时候只需要考虑哪些地方需要保护
      规则以后看情况随时加

     4.flow等3个规则现在没有状态属性对吗? 比如一个规则想禁用,但不想删除。 以后会不会考虑加入规则启用/禁用开关 或者是说需要自己在存储时去实现规则的启用/禁用

          不行 不这么做的原因是 为了节省客户端的内存 这些规则的管理 fangzaidashboard去做 客户端只接受有效的规则

          xxxRuleManager加载的都是有效的规则,在存储端去实现禁用的规则


    5.请问这种方式能区分应用吗? 两个不同的应用,各配了1个流控规则,用http请求发现只返回了1个规则,在控制台能看到2个
    => 不同应用配置不同端口

    6.rocketmq的削峰填谷 对比 sentinel的削峰填谷

    rocketmq在服务端 来削峰填谷
    sentinel客户端来做这件事情
    rocket mq dubbo是生态圈的大树
    我们所有的开源产品 都围绕这个大树 但又开放 拥抱别的主流框架
    产品产品之间 没有强依赖
    mq可以用sentinel 也可以用hystrix来熔断降级
    同理 sentienl可以用于mq也可以用于kafaka

    rocketmq在服务端来削峰填谷
    sentinel客户端来做这件事情
    rocket mq dubbo是生态圈的大树
    我们所有的开源产品 都围绕这个大树 但又开放 拥抱别的主流框架
    产品产品之间 没有强依赖
    mq可以用sentinel 也可以用hystrix来熔断降级
    同理sentienl可以用于mq也可以用于kafaka

    说实话,mq削峰填谷以前都没有听说。
    个人理解,mq作为消息中间件,通过消息产生/消费这种异步模型实现解耦,并且有一定的消息堆积能力;
    而sentinel定位于高可用流量防护和系统保护框架,是通过程序埋点和内部算法,比如匀速等控制速率发送来实现
    流量的削峰填谷的,比如rocketmq demo里,是在接收消息时进行的sentinel埋点;

    通过mq缓存生产者的消息波峰,消费者根据自身的能力进行消费。消费者可以根据自身的消息处理速度进行消息的拉取。
    对,我理解的mq削峰填谷也是这样的。可后面那句,消费者可以根据自身的消息处理速度进行消息的拉取,这sentinel就派上用场了吧
    我也是这么理解的,消费者能消费多快就拉多快
    不就是根据自身消费速度来拉取么?不需要额外使用sentinel吧?

    消费者能消费多快就拉多快,这种可能有问题,因为它没有控制。而消费者可能调下游的服务,造成负载过高
    所以场景是消费者的下游还有服务才需要sentinel?

    一般消费者是一个业务流程的开始,除非很简单,如果是微服务结构的话一般都有调用链的。 如果没有下游,那可以一起想想本身有需要控制的场景
    有流控就有一个保护机制,总比没有好吧。而且规则可以修改不重启、我觉得这是sentinel方便的地方,轻巧

    7.flow rule 匀速器使用场景

    QPS超出排队,默认排队超时时间500ms,


    在需要削峰填谷,控制处理速率的地方使用;

    count 代表1s内希望通过的数量,对应两个请求之间的时间间隔就是 1000ms/count,count 要根据系统能承受的负载来设;超时时间建议不要设的非常大;

    sentinel在mq的应用场景
    1.发送消息


    2.消费消息

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1.dashborad,浏览器打开,报angular未定义
    => js、css等资源是通过cdn下载的,需要联网,检查是否是内网环境

    2.阿里的sentinel和Redis里的sentinel区别
    阿里的sentinel=>高可用防护的流量管理框架 https://github.com/alibaba/Sentinel
    redis的sentinel=>主要是用来监控和切换用的
    3.build spring-cloud-alibaba-sentinel的时候报这个错:java.io.IOException: Cannot run program "egrep" CreateProcess error=2,系统找不到指定的文件
    mvn build

    4.如果系统保护规则和限流规则和熔断规则 都配置的情况下 优先级是怎么走呢
    限流规则先于降级规则生效,顺序参见:DefaultSlotsChainBuilder中的注册顺序

    5.TimeUtil线程CPU切换开销
    这个并发高的时候减少native的调用 小的时候估计就正如你说的, 有损耗
    因为计算QPS要把一秒划成1000份 1/1000 秒 然后相同毫秒级别的请求 放到一个窗口里. 变相减少竞争 要不然锁竞争太厉害
    这个监控上是一个通用的做法 不能用System.currentTimeMillisce会有严重的并发问题。所以监控上都会用这个做法来计数 并发场景下 System.currentTimeMillis() 的性能问题 http://buru.iteye.com/blog/1779991
    高并发场景下System.currentTimeMillis()的性能问题优化 https://www.xttblog.com/?p=2289
    webmasters / 高并发场景下 System.currentTimeMillis() 的性能优化 https://gitee.com/webmasters/codes/b1ighnzof07catx3qs4y551
    System.currentTimeMillis()性能分析 https://www.jianshu.com/p/3fbe607600a5

    6.

    com.taobao.csp.sentinel.dashboard.datasource.entity.MetricEntity

     private Long passedQps;

     private Long successQps;

    private Long blockedQps;

    private Long exception;

    这几个属性怎么定义?它们之间是什么关系?与qps又是什么关系?

    谁可以解释一下,谢谢

    passedQps+blockedQps=successQps+exception=qps?

    PASSEDQPS+BLOCKEDQPSS是近来的流量
    successqps是出去的流量
    把系统想想成一个水管
    一个是入口 一个是出口

    exception是 凡是调用了 tracer.trace(e)的统计
    如果你不调用 也就 不会统计
    主要是统计业务逻辑

    7.我有一个问题,数据库连接池资源,要怎么保护呢? 比如有多个读和写的api,如果读请求占据了所有的请求,导致写请求饥饿。 我看sentinel有关联流量控制,不知道实际生产环境中是怎么实践的?


    一般关联xianliu 就是用于这个厂及国内
    场景
    另外把一些可能的慢Sql,加上并发保护

    -------------------------------------------------------------------------------------

    -Dcsp.sentinel.dashboard.server=consoleIp:port // 控制台ip和端口
    -Dcsp.sentinel.api.port=8719 // 客户端api监控端口,默认8719,单机多个应用需要配置不同的端口 
    -Dproject.name=xxx // 应用名称 
    ----------------------------------------------------------------------------------------
    常用:
    控制台没有显示我的应用或者没有监控展示如何排查
    https://github.com/alibaba/Sentinel/wiki/FAQ#q-sentinel-%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%B2%A1%E6%9C%89%E6%98%BE%E7%A4%BA%E6%88%91%E7%9A%84%E5%BA%94%E7%94%A8%E6%88%96%E8%80%85%E6%B2%A1%E6%9C%89%E7%9B%91%E6%8E%A7%E5%B1%95%E7%A4%BA%E5%A6%82%E4%BD%95%E6%8E%92%E6%9F%A5
  • 相关阅读:
    A1117. Eddington Number
    A1116. Come on! Let's C
    A1115. Counting Nodes in a BST
    A1114. Family Property
    A1113. Integer Set Partition
    OC之【NSValue的使用】
    OC之【NSDate使用】
    NSString与int和float的相互转换
    OC之【@protocol协议】
    OC之【深拷贝(mutableCopy)和浅拷贝(copy)】
  • 原文地址:https://www.cnblogs.com/cdfive2018/p/9529281.html
Copyright © 2020-2023  润新知