基于业务功能级别的流量控制

之前产品线上发生过若干次因为tomcat连接池被耗尽而导致宕机的故障,而具体根源原因则各不尽相同。有因为调用和被调用的服务申请相同的分布式锁而导致死锁的,有因为发送内部或外部的JMS消息发生堵塞的,有因为某个存在性能问题的接口被较多调用导致的,还有某些超高频接口没有做好专门优化而导致的。。。
       所有上述问题的本质解决,肯定是要针对各种问题根源,分别予以解决。解决死锁问题,外部接口做好严格的访问超时控制,非核心业务逻辑尽量异步处理,尽可能的通过增加cache来减少数据库压力等等。但除此之外,系统中任何一个业务点都可能拖垮整个系统,系统整体的脆弱程度值得深思。为什么瘸了腿的人会死?不,他应该还要能编程。
        其实,这个问题的本质在于tomcat只有一个共享线程池,所有的业务请求都会分配给一个线程,直至请求处理完毕,线程才会被回收。任何一个长请求,都会长期侵占导致宝贵的tomcat连接池资源。这点其实在tomcat7上已经做了优化支持,tomcat7支持了异步处理。此特性将http线程池和业务service线程池做了分离,这样一个IO等待的业务请求,只会侵占业务service线程池。但这没有解决本质问题,因为虽然解决了http线程池的资源问题,但累积膨胀的业务service线程池,对jvm内存、cpu,数据库等仍是一个威胁。坏孩子和调皮的孩子其实放到哪里都是问题,他们需要被好好管理。需要控制他们的发言次数,这样哪些无辜的乖孩子才有机会发言,老师也才能听到有意义的反馈。
        那么,我们需要做什么呢?
 1.我们需要做好资源隔离,防止任何一个业务功能消耗过多的连接池资源,甚至,在必要的时候,可以完全禁止这个问题业务功能。
 2.业务功能的流量阈值或开关,能够及时、动态的予以调整。
 3.业务功能如果流量超限,可以定制的做异常处理。
         解决问题一,我们设计了一个Aspect。它拦截了所有的业务功能请求,然后根据具体业务功能的流量阈值对请求进行控制。如果未超限,则放行,放行前增加计数,业务功能执行完成后回收计数;如果超限,则获取相应的异常处理策略进行处理。主要包含了流量计数器,阈值管理器和异常处理器这3个部分。
框架简图如下:

处理流程图如下:

解决问题二和三,即阈值和处理策略动态调整的问题。显然,配置文件是不合适的,那意味着要做应用重启。将配置信息保存到memcache中?那意味着每个业务请求都需要访问至少2次网络请求,这是不小的开销。那看来,如果能将这些信息冗余在服务器节点的内存里会性能不错,那内容如何获取和更新呢?服务器节点应该初始化的时候从一个中心节点拉取配置,然后通过长连接的方式监听在中心节点的配置变更时间,在发生变更新,从中心节点拉取相应新内容。中心节点最好还能是高可用的,高性能的,以及拥有良好的一致性。听起来美好,要真开发起来可还真不简单。幸运的是,牛人们早已为我们铺好大路了,那就是Zookeeper!它从核心上完美地解决了我们的需求。不过,到这里,其实还不够。我们的配置需要能持久保存,如果zookeeper真的挂了怎么办?最好有个漂亮的配置管理界面,你会喜欢在一个黑乎乎的界面上疯狂的敲打键盘吗,那是黑客帝国的剧情。此外,最好还能有非常方便的客户端编程接口API,不,甚至不要给我任何API,我添加几个注解就一切搞定最好,好吧,我们程序员就是懒!~
        让我们来看看开源的配置管理服务框架吧,diamond(阿里),disconf(百度),qconf(奇虎360)。随都是师出名门,但由于研发年代、测重点都会略有不同。先看看Diamond和Disconf的对比:
淘宝DiamondDisconf
比较
数据持久性存储在mysql上存储在mysql上
都持久化到数据库里,都易于管理
推拉模型拉模型,每隔15s拉一次全量数据基于Zookeeper的推模型,实时推送
disconf基于分布式的Zookeeper来实时推送,不断是在稳定性、实效性、易用性上均优于diamond
配置读写支持实例对配置读写。支持某台实例写配置数据,并广播到其它实例上只支持实例对配置读。通过在disconf-web上更新配置到达到广播写到所有应用实例
从目前的应用场景来看,实例对配置的写需求不是那么明显。disconf支持的中心化广播方案可能会与人性思考更加相似。
容灾多级容灾模式,配置数据会dump在本地,避免中心服务挂机时无法使用多级容灾模式,优先读取本地配置文件。
双方均支持在中心服务挂机时配置实例仍然可以使用
配置数据模型只支持KV结构的数据,非配置文件模式支持传统的配置文件模式(配置文件),亦支持KV结构数据(配置项)
使用配置文件的编程方式可能与程序员的编程习惯更为相似,更易于接受和使用。
编程模型需要将配置文件拆成多个配置项,没有明显的编程模型在使用配置文件的基础上,提供了注解式和基于XML的两种编程模型
并发性多条配置要同时生效时,无法解决并发同时生效的问题基于注解式的配置,可以解决并发性问题
推拉模型和编程模型上,disconf都更加符合我们的需求。可能后来者好是因为能站在前面巨人的肩膀上。下图的disconf的核心流程图:

更完整的的关于disconf的信息请大家看:
Create new page · knightliao/disconf Wiki · GitHub 。
至于qconf,基本特性同disconf差不多,当相关文档比较少,也没有特别详细,也就没有考虑了。感兴趣的同学可以看下:
https://github.com/Qihoo360/QConf/blob/master/README_ZH.md ,和 http://v.youku.com/v_show/id_XOTI1NTI2ODI0.html(视频教程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/271828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用队列处理 API 速率限制

对于遇到速率限制的应用程序来说也是一个挑战,因为它需要“放慢速度”或暂停。这是一个典型的场景: 初始请求:当应用程序发起与 API 的通信时,它会请求特定的数据或功能。API 响应: API 处理请求并响应请求的信息或执…

linxu重启网络服务失败——Failed to start LSB: Bring up/down networking.

一、出现问题的场景 在虚拟机中的Linux系统启动后,发现没有网络,执行ifconfig 发现自己配置的ens33网卡没有启动。 接着,执行systemctl restart network 重启网络服务失败 查看网络状态,执行 systemctl status network 发现报错…

有什么好用的C/C++源代码混淆工具?

​ 有什么好用的C/C源代码混淆工具? 开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护,防止应用…

圣诞树(动态效果)

一、运行效果 二、制作方法 1.复制代码到Dreamweaver或HBuilder或vscode中 2.点击运行---运行到浏览器---选择你要打开的浏览器 3.打开后会出现这个界面,前四个是固定音乐,最后一个是自主选择的音乐,你可以选择你电脑上的歌曲&#xff0c…

CCF-CSP真题《202309-2 坐标变换(其二)》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202309-2试题名称:坐标变换(其二)时间限制:2.0s内存限制:512.0MB问题描述: 问题描述 对于平面直角坐标…

vue项目中使用axios发送http请求添加header自定义变量出现跨域问题

request代码片段: export const request (api,method,params {},config,responseType {} ) > {let apiToken localStorage.getItem("token");let headers {Authorization: ${apiToken},};if (config?.headers) {headers {...headers,...config…

java:4-7运算符优先级

运算符优先级 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。只有单目运算符(第二行)、赋值运算符(倒数3行)是从右向左运算的。一览表, 不要背&#x…

SecuSphere:一款功能强大的一站式高效DevSecOps安全框架

关于SecuSphere SecuSphere是一款功能强大的一站式高效DevSecOps解决方案,DevSecOps作为一个经过针对性设计的集中式平台,可以帮助广大研究人员管理和优化漏洞管理、CI/CD管道集成、安全评估和DevSecOps实践。 SecuSphere是一个功能全面的DevSecOps平台…

公司办公文件数据\资料防泄密软件系统——自动智能透明加密保护核心数据

天锐绿盾办公文件数据防泄密软件系统是一款自动智能透明加密保护核心数据的软件系统。 PC访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是该系统的几个核心特点: 自动智能加密:系统采用自动…

K8s 源码剖析及debug实战(一):Minikube 安装及源码准备

文章目录 0. 引言1. 什么是 Minikube2. 安装 Minikube3. 下载 Go4. 下载 Goland5. 下载 K8s 源码6. 后续 0. 引言 欢迎关注本专栏,本专栏主要从 K8s 源码出发,深入理解 K8s 一些组件底层的代码逻辑,同时借助 debug Minikube 来进一步了解 K8…

HarmonyOS Watch状态变量监听

今天 我们要将 Watch装饰器 状态变量更改通知 那么 关键点 状态变量 就是 更改后页面会响应式更新的响应式数据 我们可以这样写 Entry Component struct Index {State Watch("setName") name:string "小猫猫";setName() {console.log("变量改变&q…

为什么 C 语言被广泛应用于嵌入式系统开发?

为什么 C 语言被广泛应用于嵌入式系统开发? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C 语言的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家&a…

超纯水抛光树脂:光伏行业新技术应用

在清洁能源的领域中,高效太阳能电池,尤其是单晶硅电池,正日益受到重视。这些电池不仅转换效率高,而且耐用性强。然而,它们的制造过程对水质有着极高的要求,这就引入了超纯水的重要性。那么,超纯…

一套UWB精准定位系统源码,java语言开发,基于UWB技术自主研发的高精度人员定位系统源码

一套UWB精准定位系统源码,基于UWB技术自主研发的室内外人员定位系统源码 随着经济的高速发展,现代制造业生产设备日益繁多,生产车间面积广阔,生产工人数量多,存在难以进行有效管理和不便实施全方位风险管控的难题。 人…

kubernetes(k8s) Yaml 文件详解

YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读。 1、查看API 资源版本标签 kubectl api-versions 2、编写资源配置清单 kubectl create -f nginx-test.yaml --validatefalse 2.3 查看创建的po…

MySQL报错:1054 - Unknown column ‘xx‘ in ‘field list的解决方法

我在操作MySQL遇到1054报错,报错内容:1054 - Unknown column Cindy in field list,下面演示解决方法,非常简单。 根据箭头指示,Cindy对应的应该是VARCHAR文本数字类型,字符串要用引号,所以解决方…

与供应商合作:成功供应商管理的六种最佳实践

许多企业低估了他们对外部供应商的依赖程度,也小看了这些供应商关系所涉及的风险。本文将探索企业与外部供应商合作的六种最佳实践,利用它们创建有效的供应商管理流程,从而降低成本和风险,并提高盈利能力。 供应商管理为何重要&a…

jsp页面bootstrap表格设置页面跳转一直在底部

首先介绍一下bootStrap和bootStrap table: bootStrap: Bootstrap是Twitter推出的一个用于前端开发的开源工具包。 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。 bootStrap table: Bootstrap table 是一款基于 Bootstrap 的 jQue…