nginx break-circus
upstream : read-timeout,connection-timeout,分级别 500ms,1S,100S,长链接
---颗粒度[每个服务api health-check]---
---
openresty---lua--rest--dynamic upstream
---traefik--三个出问题了--如何摘掉--
deployment---ds方式--
每类服务的时间---
websocket/io 的部署--放在nginx层,甚至更前面;静态放在cdn,qiniu
服务器剩余空间检查-----------运维老师负责
剩余空间不足,直接影响考试提交,因此应保证剩余空间至少在
做定时任务,只保留半年内的导出考试答卷包文件
服务器配置信息检查,请按下面建议配置参数配置或核查:-----------运维老师负责
1.jvm 配置参数 最大不要超过4G, GC log, 指定GC类型 并行
JAVA_OPTS="-Xms4096m -Xmx4096m -XX:-PrintGCDetails -Xloggc:/data/logs/tomcat/sso/gc_tomcat.log"
2. server.xml配置线程
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="512" minSpareThreads="256" maxQueueSize="300" maxIdleTime="60000" />
3. 数据库
db.main.initialPoolSize=64
db.main.minPoolSize=64
db.main.maxPoolSize=256
除现有基本日志信息外,还需要服务器增加如下日志信息-----------运维老师负责
nginx 要求配置request_time和upstream response time
mysql 慢查询日志
熔断怎么做
首先,需秉持的一个中心思想是:量力而行。因为软件和人不同,没有奇迹会发生,什么样的性能撑多少流量是固定的。这是根本。
然后,这四步走分别是:
定义一个识别是否处于“不可用”状态的策略
切断联系
定义一个识别是否处于“可用”状态的策略,并尝试探测
重新恢复正常
定义一个识别是否处于“不正常”状态的策略
相信软件开发经验丰富的你也知道,识别一个系统是否正常,无非是两个点。
是不是能调通
如果能调通,耗时是不是超过预期的长
这个标准可以有两种方式来指定。
阈值。比如,在10秒内出现100次“无法连接”或者出现100次大于5秒的请求。
百分比。比如,在10秒内有30%请求“无法连接”或者30%的请求大于5秒。
切断联系
切断联系要尽可能的“果断”,既然已经认定了对方“不可用”,那么索性就默认“失败”,避免做无用功,也顺带能缓解对方的压力。
分布式系统中的程序间调用,一般都会通过一些RPC框架进行。
那么,这个时候作为客户端一方,在自己进程内通过代理发起调用之前就可以直接返回失败,不走网络。
这就是常说的「fail fast」机制。就是在前面提到的代码段之前增加下面的这段代码。
定义一个识别是否处于“可用”状态的策略,并尝试探测
切断联系后,功能的完整性必然会受影响,所以还是需要尽快恢复回来,以提供完整的服务能力。这事肯定不能人为去干预,及时性必然会受到影响。那么如何能够自动的识别依赖系统是否“可用”呢?这也需要你来定义一个策略。
一般来说这个策略与识别“不可用”的策略类似,只是这里是一个反向指标。
阈值。比如,在10秒内出现100次“调用成功”并且耗时都小于1秒。
百分比。比如,在10秒内有95%请求“调用成功”并且98%的请求小于1秒。
同样包含「时间窗口」、「阈值」以及「百分比」。
稍微不同的地方在于,大多数情况下,一个系统“不可用”的状态往往会持续一段时间,不会那么快就恢复过来。所以我们不需要像第一步中识别“不可用”那样,无时无刻的记录请求状况,而只需要在每隔一段时间之后去进行探测即可。所以,这里多了一个「间隔时间」的概念。这个间隔幅度可以是固定的,比如30秒。也可以是动态增加的,通过线性增长或者指数增长等方式。
这个用代码表述大致是这样。
复制代码
全局变量 successCount = 0;
//有个独立的线程每隔10秒(时间窗口)重置为0。
//并且将下面的isHalfOpen设为false。
全局变量 isHalfOpen = true;
//有个独立的线程每隔30秒(间隔时间)重置为true。
//do some thing...
if(success){
if(isHalfOpen){
successCount ++;
if(successCount = 可用阈值){
isOpenCircuitBreaker = false;
}
}
return success;
}
else{
errorcount++;
if(errorcount == 不可用阈值){
isOpenCircuitBreaker = true;
}
}
复制代码
另外,尝试探测本质上是一个“试错”,要控制下“试错成本”。所以我们不可能拿100%的流量去验证,一般会有以下两种方式:
放行一定比例的流量去验证。
如果在整个通信框架都是统一的情况下,还可以统一给每个系统增加一个专门用于验证程序健康状态检测的独立接口。这个接口额外可以多返回一些系统负载信息用于判断健康状态,如CPU、I/O的情况等。
重新恢复正常
一旦通过了衡量是否“可用”的验证,整个系统就恢复到了“正常”状态,此时需要重新开启识别“不可用”的策略。就这样,系统会形成一个循环。
nginx break-circus的更多相关文章
- Nginx Rewrite相关功能
目录 Nginx Rewrite相关功能 ngx_http_rewrite_module模块指令: if指令: set指令: break指令: return指令: rewrite_log指令: rew ...
- 015.Nginx重定向
一 重定向概述 1.1 重定向介绍 重定向(Redirect)指通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向.域名的重定向.路由选择的变化也是对数据报文经由路径的一种重定向). ...
- nginx rewrite 指令last break区别最详细的解释
转自:http://blog.sina.com.cn/s/blog_4f9fc6e10102ux0w.html http://blog.cafeneko.info/2010/10/nginx_rewr ...
- nginx last 和break redirect 和 permanent
一.last & break (1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异. 注意一点就是,他们会跳过所有的在他们之后的rewrite 模块 ...
- nginx中的break与last指令区别
很多人资料说,last与break的区别在于,last并不会停止对下面location的匹配.我理解上模模糊糊.今天自己来测验了一下. rewrite 指令末尾的break应该与单独写break作用是 ...
- nginx rewrite规则last与break的区别
概要:break和last都能阻止继续执行后面的rewrite指令,last如果在location下的话,对于重写后的URI会重新匹配location,而break不会重新匹配location. 区别 ...
- [nginx]nginx rewrite规则之last和break
c俺靠这篇博文 http://eyesmore.iteye.com/blog/1142162 有用的配置: 1.开启rewrite_log,这样在/var/log/nginx/error.log中显示 ...
- nginx url rewrite break和last的区别
break 将重写的URI作为一个新的URI,在本块中继续处理,将重写后 的地址在当前location块中处理,不会将新的URI转向到其他location块中 last,终止继续在本location块 ...
- Nginx中的break和last
rewrite中的break和last 两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite.return指令). 示 ...
- nginx rewrite中的break和last
两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite.return指令). 示例1:(连续俩条rewrite规则)se ...
随机推荐
- pythonのdjango初体验
简单的一个列表展示,实现了增.删.插 1.通过新建项目来创建一个Django项目 2.通过pycharm中的Terminal来创建app ,命令如下: python manage.py start ...
- Django之auth模块
http://www.cnblogs.com/liwenzhou/p/9030211.html 1.首先导入auth模块 from django.contrib import auth 2.创建aut ...
- 机器学习爱好者 -- 翻译吴恩达老师的机器学习课程字幕 http://www.ai-start.com/
机器学习爱好者 -- 翻译吴恩达老师的机器学习课程字幕 GNU Octave 开源 MatLab http://www.ai-start.com/ https://zhuanlan.zhihu ...
- vue之生命周期钩子函数之运用
一.什么是生命周期钩子函数: 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时在这个过程中也会运行 ...
- Beta冲刺(2/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(2/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 做了点商家数据表格 接下来的计划 做 ...
- Linux Vi 的使用
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...
- vue.js组件命名
- POJ 3104 Drying
最让HSQ学长头疼的就是洗衣服了.洗完之后,每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分.令人遗憾是HSQ所在的宿舍 ...
- 随机获取min和max之间的一个整数
// 随机获取min和max之间的一个整数 const randomNum = (Min, Max) => { let Range = Max - Min; let Rand = Math.ra ...
- Composer更新慢的解决方案
有两种方式启用镜像服务: 系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中. 单个项目配置: 将配置信息添加到某个项目的 composer.json 文 ...