通过计数器实现接口限流

标签: 计数器 接口 | 发表时间:2017-06-22 19:11 | 作者:hbxflihua
出处:http://www.iteye.com

如果接口可能会有突发访问情况,但又担心访问量大而导致系统崩溃,这个时候就需要对接口的请求并发数进行限制了。可以为相应的接口设置对应的阈值,超过则拒绝请求或者排队等待。

 

1、使用java自带的concurrent包下的类进行限流,示例代码如下:

	private static final AtomicLong atomic = new AtomicLong(0);
	
	public static void limitByAtomic(String hello)throws Exception{		
		try{
			if(atomic.incrementAndGet() > 2){
				//拒绝请求
			}			
			//处理请求			
		}finally{
			atomic.decrementAndGet();
		}	
	}

 

2、使用guava的Cache来限流,示例代码如下:

	public static void limitByCounter(String hello)throws Exception{
		LoadingCache<Long, AtomicLong> counter = 
				CacheBuilder.newBuilder()
				.expireAfterWrite(2, TimeUnit.SECONDS)
				.build(new CacheLoader<Long, AtomicLong>(){
					@Override
					public AtomicLong load(Long seconds) throws Exception {
						return new AtomicLong(0);
					}					
				});
		
		long limit = 1000;

		while(true){
			long currentSeconds = System.currentTimeMillis() / 1000;
			if(counter.get(currentSeconds).incrementAndGet() > limit){
				//拒绝请求
				continue;
			}
			//处理业务
		}				
	}

 

以下是Guava的Cache实现的一个简易版超限计数器

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
 * guava计数器工具类
 * 
 * @author lh
 * @version 2.0
 * @since 2017-06-22
 *
 */
public class GuavaCounterUtil {

	private static final Logger LOGGER = LoggerFactory.getLogger(GuavaCounterUtil.class);

	private static final LoadingCache<String, AtomicLong> counter = CacheBuilder.newBuilder()
			.expireAfterWrite(2, TimeUnit.SECONDS)// 每两秒清除一次
			.build(new CacheLoader<String, AtomicLong>() {
				@Override
				public AtomicLong load(String seconds) throws Exception {
					return new AtomicLong(0);
				}
			});

	/**
	 * 请求是否超限
	 * 
	 * @param uri
	 *            请求地址(接口地址或其他可标识字符)
	 * @param limit
	 *            每秒请求限制数
	 * @return
	 */
	public static final boolean overLimit(String uri, long limit) {

		long currentSeconds = System.currentTimeMillis() / 1000;
		try {
			return counter.get(uri + currentSeconds).incrementAndGet() > limit;
		} catch (ExecutionException e) {
			LOGGER.warn(e.getMessage(), e);
		}
		return false;
	}

}

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [计数器 接口] 推荐:

通过计数器实现接口限流

- - 行业应用 - ITeye博客
如果接口可能会有突发访问情况,但又担心访问量大而导致系统崩溃,这个时候就需要对接口的请求并发数进行限制了. 可以为相应的接口设置对应的阈值,超过则拒绝请求或者排队等待. 1、使用java自带的concurrent包下的类进行限流,示例代码如下:. 2、使用guava的Cache来限流,示例代码如下:.

iOS 免费接口

- - ITeye博客
京东获取单个商品价格接口:. http://p.3.cn/prices/mgets?skuIds=J_商品ID&type=1. ps:商品ID这么获取:http://item.jd.com/954086.html. http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号.

雷电接口(Thunderbolt)问答

- Richard - Apple4.us
这次的 MacBook Pro 更新带来了一种新的接口 Thunderbolt(雷电),不但速度比火线 800 和 eSATA 都快得多,更可同时担当数据、视频、音频传输之重任. 这里是 Dan Frakes 和 Dan Moren 为 Macworld.com 写的雷电基础指南,译出供大家参考. 雷电(旧称「光峰」Light Peak)是 Intel 与苹果合作研发的一种新的外设接口技术,它能把数据、视频、音频和电力的传输集合到一个单独的接口上.

移动平均 - IGod接口

- - 博客园_1 + 1 = The World
示例——移动平均在股票分析. 最近大 BOSS“迷上”了一个网络游戏(什么游戏就不多说啦~),让我写个程序帮他算一下(现在他让另一个同事写了,我要改 bug 没时间,所以,我主要是没事时“凑热闹”提点想法). 期间,发现这个游戏一定是基于某个数学模型,试了很多方法,比如,文本相似度,曲线相似度等等,都不能很好的预测,最后,采用移动平均以及变体,就靠谱多了~本文主要回忆一下移动平均相关的问题.

Android异步接口测试

- - 百度质量部 | 软件测试 | 测试技术 | 百度测试
    基于Android的C/S移动应用中访问后端数据的场景是非常多的,异步接口测试主要是在单元测试完成的基础上检查接口级访问是否正确,主要保证对外请求的组装与发送是否符合后端的约定. 现在项目的异步接口访问都遵循一个特定的访问模式:前台的Activity获取到触发事件后将接受到的参数传给一个异步任务,这些任务大都是AsyncTask的实现——即启动一个新的线程访问后台接口数据,完毕后调用回调函数更新UI展示,示意图如下:.

各个IP API接口

- - 谁主沉浮
腾讯的IP地址API接口地址: http://fw.qq.com/ipaddress. 返回的是数据格式为:var IPData = new Array(“114.218.183.139″,””,”江苏省”,”苏州市”);. .

Spring中Aware相关接口

- - 企业架构 - ITeye博客
加载Spring配置文件时,如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的. 方法,获得ApplicationContext对象. 前提必须在Spring配置文件中指定该类.

Sina股票数据接口

- - 互联网 - ITeye博客
以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据. 接口:http://hq.sinajs.cn/list=sh601006这个url会返回一串文本,例如:. var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92,.

API 接口设计规范

- - 掘金后端
这篇文章分享 API 接口设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. url?后面的参数,存放请求接口的参数数据. 请求头,存放公共参数、requestId、token、加密字段等. Body 体,存放请求接口的参数数据. 调用方需向服务方申请 appKey(请求时使用) 和 secretKey(加密时使用).

SATA Express新接口、数据线图解

- Jerry - cnBeta.COM
SATA-IO组织日前宣布,正在着手制定新的高速SATA标准规范,传输带宽将提升到8Gbps和16Gbps,而为达此目标将在SATA中融入PCI-E技术. 很自然地,SATA接口、数据线也将会因此发生变化. SATA-IO目前已经组建了新的数据线和接口工作组,专门用来为SATA Express制定新的接口、数据线规格,预计2011年底完成.