问题解决系列: 后台服务流量控制- 控制访问别的服务的速度

互联网的后台提倡大系统小做,微服务化。所以后台服务之间相互依赖,我依赖别人的,别人也依赖我的,这很正常。

但是后台服务讲稳定性。只有一切可控,才能谈稳定性。

为了不冲垮下游的服务,我们有两种做法:一种是下游服务做一个自我保护(具体实现方法下次再写),一种是上游保护下游。

比如A服务向B服务发送消息,B给A分配了每分钟3000条消息的访问量。那么A如何控制自己每分钟的访问量在3000次以内呢?

基本思路:

这是个分布式的问题,A服务可能包含了堕胎机器,所有的机器共享一个设定的配额 3000次/每分。

借助redis来管理配额。

每次A向B发起请求时,先检查一下配额够不够。不够就延时等待,使用下一分钟的配额。

既然使用了redis, 还要考虑到redis服务挂了的情况,也要能正常发送消息。

如果Redis挂了,作为应急方案,可以使用简单睡眠的方法来控制速度。

/**

*  以分钟为单位,每分钟发送的消息数控制在指定范围内, 缺省 每分钟 3000条消息/分钟。

* 如果返回false, 对于调用者来说,需要睡眠一段时间再次检查是否可以发送消息。

* */

private boolean allowSendMsg(int msgNum) {

boolean allowSendMsgRet = true;

long curMinute = new Date().getTime()/60000;

//在redis中查找当前这一分钟的配额

String key = "msg_flowctl_" + String.valueOf(curMinute);

boolean redisException = false;

try {

if (redis.exists(key)) {

long remainingMsgNum = redis.decrBy(key, msgNum);

if (remainingMsgNum <= 0) { /**当前这分钟的额度用完了*/

allowSendMsgRet = false;

}

} else {

//这一分钟的配额在redis还没有,那么进行初次设置。如果一次要求的已经大于3000。 这里采取了比较宽松的策略,就是允许它过。

//其实还可以要求调用方对请求进行拆分。

long remainingMsgNum = msgNum > 

3000

? 0 : 3000 - msgNum;

redisTemplate.getJedisCmd().set(key, String.valueOf(remainingMsgNum));

redisTemplate.getJedisCmd().expire(key, 60);

}

} catch (Exception e) {

//redis不可靠要记下来

redisException = true;

}

if (redisException) {

/**redis 失效以后的流控应急方案。

*

* 通过睡眠线程来限制发往企信后台的速度.

* 3000个人(消息)/分钟,算出来每条消息要睡眠20ms.

* 假设当前A服务总共有两条服务器,因此每条消息需要睡眠40ms.

*

* 这种方法简单粗暴而有效,只能保证单台服务器 发送1500条消息到B服务,时间段肯定是超过一分钟的。

* 缺点:(1) 时间粒度太粗。

* (2) 不易运维。需要代码结合部署的服务器数量。

* 比如代码转手几次以后,扩容机器。扩容的同学没有意识到,发往B服务的速度变快了。

* */

try {

Thread.sleep(msgNum * sleepMiniSecPerMsg);

} catch (Exception e) {}

}

return allowSendMsgRet;

}

时间: 2024-12-22 07:09:27

问题解决系列: 后台服务流量控制- 控制访问别的服务的速度的相关文章

创建ACL语句使真机访问虚拟服务器的web服务并禁止访问FTP服务详解

创建ACL语句使真机访问虚拟服务器的web服务并禁止访问FTP服务 首先创建拓扑,然后规划好IP地址并连接拓扑线 配置理念是先配置简单的最后配置复杂的. 首先需要保证网络拓扑的互联互通:具体配置如下 R1上面的配置 SW3上面的配置 SW2上面的配置 SW1上面的配置 设置宿主机上的IP地址 打开虚拟机server 2008配置IP地址 给server 2008服务器 添加web服务和FTP服务 点击添加角色之后,再点击下一步,进入这个页面 再点击两次下一步,就会进入这个页面 后面根据提示点击下

Oracle 11g服务详细介绍及哪些服务是必须开启的?

安装oracle 11g R2中的方法成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy).它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的系统能.(非必须启动) 2. OracleDBConsoleorcl:

Oracle 11g服务详细介绍及哪些服务是必须开启的

成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy).它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的系统能.(非必须启动) 2. OracleDBConsoleorcl: Oracle数据库控制台服务,or

Oracle11g服务详细介绍及哪些服务是必须开启的?

中的方法成功安装Oracle 11g后,共有7个服务, 这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy).它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的系统能.(非必须启动) 2. OracleDBConsoleorcl:Oracle数据库控制台服

&#8203;web服务目录的访问权限的控制

web服务目录的访问权限的控制 1.确认web服务器已经安装并启动 [[email protected] ~]# ls /usr/local/httpd/ [[email protected] ~]# netstat -utpln |grep 80 tcp        0      0 :::80                       :::*                        LISTEN      73341/httpd 2.设置只允许192.168.100.110访问,

基于Vue实现后台系统权限控制

原文地址:http://refined-x.com/2017/08/29/基于Vue实现后台系统权限控制/,转载请注明出处. 用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通前端项目除了数据交互更频繁以外,还有一个特别的需求就是对用户的权限控制,那么如何在一个Vue应用中实现权限控制呢?下面是我的一点经验. 权限控制是什么 在权限的世界里服务端提供的一切都是资源,资源可以由请求方法+请求地址来描述,权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配

【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

原文:[3分钟就会系列]使用Ocelot+Consul搭建微服务吧! 一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具有其它职责,如身份验证.监控.负载均衡.缓存.请求分片与管理.静态响应处理. Ocelot 是一

RX系列五 | Schedulers线程控制

RX系列五 | Schedulers线程控制 在我们上一篇文章中的,我们的小例子里有这么一段代码 //网络访问 .observeOn(Schedulers.io()) 事实上,我们在使用网络操作的时候,便可以控制其运行在哪个线程中,而Schedulers类,有四个方法,分别是 Schedulers.immediate(); Schedulers.newthread(); Schedulers.io(); Schedulers.computation(); 以及RxAndroid中的Android

centos7的ip地址.网关,DNS设置和服务的控制

centos7的网络设置和服务控制 需求和目的:1.学会正确配置rhel7的网络连接                         2.熟悉明确rhel7的服务控制由什么来管制                         3.能熟练的掌握网络的连通性测试             实现的效果:能熟悉rhel7的网络配置和服务,控制             理论知识点的描述:1.rhel7和rhel6以前的版本很多的配置文件都发生变化,尤其是ip地址编号格式,展现在我们眼前的rhel7的命名更