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/b1ighnzof07catx3qs4y551System.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
sentinel备忘的更多相关文章
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
- php 相关模块备忘
在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因
近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...
随机推荐
- js获取图片内容上传
<script> $('#pic').change(function(){ var size=document.getElementById('pic').files[0].size va ...
- otool随笔测试
otool 工具 查看库/反编译等二进制信息 1 依赖库查询 otool -L Payload/XXX.app/XXX 2 查看该应用是否砸壳 otool -l Payload/XXX.app/XXX ...
- 红外 NEC编码
它是一种电磁波,可以实现数据的无线传输 它的波长范围为760nm ~ 1mm,不为人眼所见 紫外光波长为10-400nm 红外与蓝牙 红外:对准.直接.0-10米,单对单 蓝牙:10米左右,加强信号后 ...
- SpringCloud之Eureka注册中心原理及其搭建
一.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCl ...
- LeetCode 滑动窗口题型整理
一.滑动窗口题型模板 /* * 滑动窗口类型: 模板 */ public List<Integer> slideWindowMode(String s, String t) { // 1 ...
- docker images 导入和导出
目录 docker images 导入和导出 1.前言 2.docker image 的保存 3.docker image 的导入 docker images 导入和导出 1.前言 前提是现在有一个可 ...
- 如何将公式插入到word
平台:win10 x64+ office 2010+ Mathpix Snipping Tool +mathtype6.9b 直接安装就行,下载好了以后,要和word连接起来还需要下载一个插件,有 ...
- java——Servlet
类要实现Servlet接口: 主要功能,生成动态网页内容: HttpServlet重写doGet和doPost方法或者重写Service方法,完成对请求的响应: 如:get.post等请求的响应. - ...
- zabbix验证微信
在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱. 具体操作: 以下操作在Zabbix监控服务端进行 备注:Zabbix监控服务端 操作系统:Ce ...
- P1198最大数——线段树点修改&&模板题
题目 题目链接 大意:维护一个数列,有两种操作: 查询操作Q L:查询当前数列中末尾L个数中的最大的数 插入操作A n:将n加上t再对D取模,将所得值插入数列末尾 解决方案 由题意知,只有两种操作 ...