- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章RateLimit-使用guava来做接口限流代码示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文主要研究的是ratelimit-使用guava来做接口限流的相关内容,具体如下.
1、问题描述 。
某天a君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃。如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦有人使用超大功率的设备,保险丝就会烧断以保护各个电器不被强电流给烧坏。同理我们的接口也需要安装上“保险丝”,以防止非预期的请求对系统压力过大而引起的系统瘫痪,当流量过大时,可以采取拒绝或者引流等机制.
2、常用的限流算法 。
常用的限流算法有两种:漏桶算法和令牌桶算法.
漏桶算法思路很简单,请求先进入到漏桶里,漏桶以一定的速度出水,当水请求过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率.
图1 漏桶算法示意图 。
对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图2所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务.
图2 令牌桶算法示意图 。
3、限流工具类ratelimiter 。
google开源工具包guava提供了限流工具类ratelimiter,该类基于“令牌桶算法”,非常方便使用。该类的接口具体的使用请参考:ratelimiter使用实践.
ratelimiter 使用demo 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package
ratelimite;
import
com.google.common.util.concurrent.ratelimiter;
public
class
ratelimiterdemo {
public
static
void
main(string[] args) {
testnoratelimiter();
testwithratelimiter();
}
public
static
void
testnoratelimiter() {
long
start = system.currenttimemillis();
for
(
int
i =
0
; i <
10
; i++) {
system.out.println(
"call execute.."
+ i);
}
long
end = system.currenttimemillis();
system.out.println(end - start);
}
public
static
void
testwithratelimiter() {
long
start = system.currenttimemillis();
ratelimiter limiter = ratelimiter.create(
10.0
);
// 每秒不超过10个任务被提交
for
(
int
i =
0
; i <
10
; i++) {
limiter.acquire();
// 请求ratelimiter, 超过permits会被阻塞
system.out.println(
"call execute.."
+ i);
}
long
end = system.currenttimemillis();
system.out.println(end - start);
}
}
|
四 guava并发:listenablefuture与ratelimiter示例 。
概念 。
listenablefuture顾名思义就是可以监听的future,它是对java原生future的扩展增强。我们知道future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用listenablefuture guava帮我们检测future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度.
推荐使用第二种方法,因为第二种方法可以直接得到future的返回值,或者处理错误情况。本质上第二种方法是通过调动第一种方法实现的,做了进一步的封装.
另外listenablefuture还有其他几种内置实现:
settablefuture:不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,可以通过程序设置此future的返回值或者异常信息 。
checkedfuture: 这是一个继承自listenablefuture接口,他提供了checkedget()方法,此方法在future执行发生异常时,可以抛出指定类型的异常.
ratelimiter类似于jdk的信号量semphore,他用来限制对资源并发访问的线程数,本文介绍ratelimiter使用 。
代码示例 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import
java.util.concurrent.callable;
import
java.util.concurrent.executionexception;
import
java.util.concurrent.executors;
import
java.util.concurrent.timeunit;
import
com.google.common.util.concurrent.futurecallback;
import
com.google.common.util.concurrent.futures;
import
com.google.common.util.concurrent.listenablefuture;
import
com.google.common.util.concurrent.listeningexecutorservice;
import
com.google.common.util.concurrent.moreexecutors;
import
com.google.common.util.concurrent.ratelimiter;
public
class
listenablefuturedemo {
public
static
void
main(string[] args) {
testratelimiter();
testlistenablefuture();
}
/**
* ratelimiter类似于jdk的信号量semphore,他用来限制对资源并发访问的线程数
*/
public
static
void
testratelimiter() {
listeningexecutorservice executorservice = moreexecutors
.listeningdecorator(executors.newcachedthreadpool());
ratelimiter limiter = ratelimiter.create(
5.0
);
// 每秒不超过4个任务被提交
for
(
int
i =
0
; i <
10
; i++) {
limiter.acquire();
// 请求ratelimiter, 超过permits会被阻塞
final
listenablefuture<integer> listenablefuture = executorservice
.submit(
new
task(
"is "
+ i));
}
}
public
static
void
testlistenablefuture() {
listeningexecutorservice executorservice = moreexecutors
.listeningdecorator(executors.newcachedthreadpool());
final
listenablefuture<integer> listenablefuture = executorservice
.submit(
new
task(
"testlistenablefuture"
));
//同步获取调用结果
try
{
system.out.println(listenablefuture.get());
}
catch
(interruptedexception e1) {
e1.printstacktrace();
}
catch
(executionexception e1) {
e1.printstacktrace();
}
//第一种方式
listenablefuture.addlistener(
new
runnable() {
@override
public
void
run() {
try
{
system.out.println(
"get listenable future's result "
+ listenablefuture.get());
}
catch
(interruptedexception e) {
e.printstacktrace();
}
catch
(executionexception e) {
e.printstacktrace();
}
}
}
, executorservice);
//第二种方式
futures.addcallback(listenablefuture,
new
futurecallback<integer>() {
@override
public
void
onsuccess(integer result) {
system.out
.println(
"get listenable future's result with callback "
+ result);
}
@override
public
void
onfailure(throwable t) {
t.printstacktrace();
}
}
);
}
}
class
task
implements
callable<integer> {
string str;
public
task(string str){
this
.str = str;
}
@override
public
integer call()
throws
exception {
system.out.println(
"call execute.."
+ str);
timeunit.seconds.sleep(
1
);
return
7
;
}
}
|
guava版本 。
1
2
3
4
5
|
<dependency>
<groupid>com.google.guava</groupid>
<artifactid>guava</artifactid>
<version>
14.0
.
1
</version>
</dependency>
|
总结 。
以上就是本文关于ratelimit-使用guava来做接口限流代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。
原文链接:http://blog.csdn.net/JIESA/article/details/50412027 。
最后此篇关于RateLimit-使用guava来做接口限流代码示例的文章就讲到这里了,如果你想了解更多关于RateLimit-使用guava来做接口限流代码示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!