日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 限流策略

發(fā)布時間:2024/9/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 限流策略 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概要

在大數(shù)據(jù)量高并發(fā)訪問時,經(jīng)常會出現(xiàn)服務(wù)或接口面對暴漲的請求而不可用的情況,甚至引發(fā)連鎖反映導(dǎo)致整個系統(tǒng)崩潰。此時你需要使用的技術(shù)手段之一就是限流,當(dāng)請求達(dá)到一定的并發(fā)數(shù)或速率,就進(jìn)行等待、排隊(duì)、降級、拒絕服務(wù)等。在限流時,常見的兩種算法是漏桶和令牌桶算法算法。

限流算法

令牌桶(Token Bucket)、漏桶(leaky bucket)和計數(shù)器算法是最常用的三種限流的算法。

1. 令牌桶算法


令牌桶算法的原理是系統(tǒng)會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當(dāng)桶里沒有令牌可取時,則拒絕服務(wù)。 當(dāng)桶滿時,新添加的令牌被丟棄或拒絕。

令牌桶算法示例

public class RateLimiterDemo {private static RateLimiter limiter = RateLimiter.create(5);public static void exec() {limiter.acquire(1);try {// 處理核心邏輯TimeUnit.SECONDS.sleep(1);System.out.println("--" + System.currentTimeMillis() / 1000);} catch (InterruptedException e) {e.printStackTrace();}} }

Guava RateLimiter 提供了令牌桶算法可用于平滑突發(fā)限流策略。
該示例為每秒中產(chǎn)生5個令牌,每200毫秒會產(chǎn)生一個令牌。
limiter.acquire() 表示消費(fèi)一個令牌。當(dāng)桶中有足夠的令牌時,則直接返回0,否則阻塞,直到有可用的令牌數(shù)才返回,返回的值為阻塞的時間。

2. 漏桶算法


它的主要目的是控制數(shù)據(jù)注入到網(wǎng)絡(luò)的速率,平滑網(wǎng)絡(luò)上的突發(fā)流量,數(shù)據(jù)可以以任意速度流入到漏桶中。漏桶算法提供了一種機(jī)制,通過它,突發(fā)流量可以被整形以便為網(wǎng)絡(luò)提供一個穩(wěn)定的流量。 漏桶可以看作是一個帶有常量服務(wù)時間的單服務(wù)器隊(duì)列,如果漏桶為空,則不需要流出水滴,如果漏桶(包緩存)溢出,那么水滴會被溢出丟棄。

3. 計數(shù)器限流算法

計數(shù)器限流算法也是比較常用的,主要用來限制總并發(fā)數(shù),比如數(shù)據(jù)庫連接池大小、線程池大小、程序訪問并發(fā)數(shù)等都是使用計數(shù)器算法。

使用計數(shù)器限流示例1

public class CountRateLimiterDemo1 {private static AtomicInteger count = new AtomicInteger(0);public static void exec() {if (count.get() >= 5) {System.out.println("請求用戶過多,請稍后在試!"+System.currentTimeMillis()/1000);} else {count.incrementAndGet();try {//處理核心邏輯TimeUnit.SECONDS.sleep(1);System.out.println("--"+System.currentTimeMillis()/1000);} catch (InterruptedException e) {e.printStackTrace();} finally {count.decrementAndGet();}}} }

使用AomicInteger來進(jìn)行統(tǒng)計當(dāng)前正在并發(fā)執(zhí)行的次數(shù),如果超過域值就簡單粗暴的直接響應(yīng)給用戶,說明系統(tǒng)繁忙,請稍后再試或其它跟業(yè)務(wù)相關(guān)的信息。

弊端:使用 AomicInteger 簡單粗暴超過域值就拒絕請求,可能只是瞬時的請求量高,也會拒絕請求。

使用計數(shù)器限流示例2

public class CountRateLimiterDemo2 {private static Semaphore semphore = new Semaphore(5);public static void exec() {if(semphore.getQueueLength()>100){System.out.println("當(dāng)前等待排隊(duì)的任務(wù)數(shù)大于100,請稍候再試...");}try {semphore.acquire();// 處理核心邏輯TimeUnit.SECONDS.sleep(1);System.out.println("--" + System.currentTimeMillis() / 1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semphore.release();}} }

使用Semaphore信號量來控制并發(fā)執(zhí)行的次數(shù),如果超過域值信號量,則進(jìn)入阻塞隊(duì)列中排隊(duì)等待獲取信號量進(jìn)行執(zhí)行。如果阻塞隊(duì)列中排隊(duì)的請求過多超出系統(tǒng)處理能力,則可以在拒絕請求。

相對Atomic優(yōu)點(diǎn):如果是瞬時的高并發(fā),可以使請求在阻塞隊(duì)列中排隊(duì),而不是馬上拒絕請求,從而達(dá)到一個流量削峰的目的。


想了解更多精彩內(nèi)容請關(guān)注我的公眾號

本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡書

GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT

總結(jié)

以上是生活随笔為你收集整理的java 限流策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。