基于信號量Semaphore的服務接口限流實例

前景回顧:
《基于計數(shù)器的服務接口限流實例》
《基于RateLimiter的服務接口限流實例》

一设塔、Semaphore信號量的介紹

Semaphore是一種在多線程環(huán)境下使用的設(shè)施,該設(shè)施負責協(xié)調(diào)各個線程杆融,以保證它們能夠正確燃乍、合理的使用公共資源的設(shè)施唆樊,也是操作系統(tǒng)中用于控制進程同步互斥的量。

我們通常使用Semaphore來確保系統(tǒng)中的最大線程并發(fā)數(shù)量刻蟹。

二逗旁、使用信號量的acquire和release

我們在以下實例中,設(shè)置getUserMail這個URL最多只能同時被兩個請求訪問舆瘪,其它請求要想訪問該URL片效,必須等待前面的請求釋放信號量才行。

@Slf4j
@RestController
public class UserMailRest {
    /**
     * 同一時刻最多只允許有兩個并發(fā)
     */
    private Semaphore semaphore = new Semaphore(2);

    @GetMapping("/getUserMail")
    public String getUserMail() {
        try {
            // 獲取信號量的請求立即得到執(zhí)行英古,未獲取到信號量的請求需要等待
            semaphore.acquire();
            Thread.sleep(2000);
            log.info("請求得到服務淀衣!");
            return "OK";
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 請求結(jié)束后將信號量釋放供其它請求使用
            semaphore.release();
        }
        return "fail";
    }
}

我們使用Jmeter模擬10個用戶在1秒內(nèi)的并發(fā)請求該URL得到的結(jié)果如下:

2019-12-24 20:59:04.862: 請求得到服務!
2019-12-24 20:59:04.862: 請求得到服務召调!
2019-12-24 20:59:06.864: 請求得到服務膨桥!
2019-12-24 20:59:06.864: 請求得到服務!
2019-12-24 20:59:08.865: 請求得到服務某残!
2019-12-24 20:59:08.865: 請求得到服務国撵!
2019-12-24 20:59:10.867: 請求得到服務陵吸!
2019-12-24 20:59:10.867: 請求得到服務玻墅!
2019-12-24 20:59:12.869: 請求得到服務!
2019-12-24 20:59:12.869: 請求得到服務壮虫!

可以看出澳厢,該URL確實在同一時間最多只能供兩個請求訪問环础。

三、使用信號量的tryAcquire

和前面文章中提到的RateLimiter類似剩拢,Semaphore也有tryAcquire方法线得,用來拒絕單位時間內(nèi)超出的并發(fā)請求。

@Slf4j
@RestController
public class UserMailRest {
    /**
     * 同一時刻最多只允許有兩個并發(fā)
     */
    private Semaphore semaphore = new Semaphore(2);

    @GetMapping("/getUserMail")
    public String getUserMail() {
        if(!semaphore.tryAcquire()){
            log.warn("調(diào)用太頻繁了徐伐,拒絕服務贯钩!");
            return "調(diào)用太頻繁了,拒絕服務办素!";
        }
        try {
            log.info("接受服務角雷!");
            Thread.sleep(2000);
            return "ok";
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release();
        }
        return "fail";
    }
}

運行結(jié)果如下:

2019-12-24 21:15:16.034 : 接受服務!
2019-12-24 21:15:16.034 : 接受服務性穿!
2019-12-24 21:15:16.050 : 調(diào)用太頻繁了勺三,拒絕服務!
2019-12-24 21:15:16.149 : 調(diào)用太頻繁了需曾,拒絕服務吗坚!
2019-12-24 21:15:16.259 : 調(diào)用太頻繁了,拒絕服務呆万!
2019-12-24 21:15:16.352 : 調(diào)用太頻繁了商源,拒絕服務!
2019-12-24 21:15:16.455 : 調(diào)用太頻繁了谋减,拒絕服務炊汹!
2019-12-24 21:15:16.552 : 調(diào)用太頻繁了,拒絕服務逃顶!
2019-12-24 21:15:16.658 : 調(diào)用太頻繁了讨便,拒絕服務!
2019-12-24 21:15:16.754 : 調(diào)用太頻繁了以政,拒絕服務霸褒!

可以看出,與acquire的區(qū)別是盈蛮,超出的8個請求全部直接被拒絕了废菱,而不是一直等待信號量的釋放。

四抖誉、總結(jié)

Semaphore是比較常用的服務接口限流方案殊轴,它與計數(shù)器和RateLimiter比較最大的優(yōu)點是,能限制住接口的最大并發(fā)數(shù)袒炉,哪怕每一個請求都是Long Call旁理,也都不用害怕累計的并發(fā)線程會將服務器壓垮的問題了。

全文完我磁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孽文,一起剝皮案震驚了整個濱河市驻襟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芋哭,老刑警劉巖沉衣,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異减牺,居然都是意外死亡豌习,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門拔疚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斑鸦,“玉大人,你說我怎么就攤上這事草雕∠镉欤” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵墩虹,是天一觀的道長嘱巾。 經(jīng)常有香客問我,道長诫钓,這世上最難降的妖魔是什么旬昭? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮菌湃,結(jié)果婚禮上问拘,老公的妹妹穿的比我還像新娘。我一直安慰自己惧所,他們只是感情好骤坐,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著下愈,像睡著了一般纽绍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上势似,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天拌夏,我揣著相機與錄音,去河邊找鬼履因。 笑死障簿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的栅迄。 我是一名探鬼主播站故,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霞篡!你這毒婦竟也來了世蔗?” 一聲冷哼從身側(cè)響起端逼,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤朗兵,失蹤者是張志新(化名)和其女友劉穎污淋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體余掖,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寸爆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盐欺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赁豆。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冗美,靈堂內(nèi)的尸體忽然破棺而出魔种,到底是詐尸還是另有隱情,我是刑警寧澤粉洼,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布节预,位于F島的核電站,受9級特大地震影響属韧,放射性物質(zhì)發(fā)生泄漏安拟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一宵喂、第九天 我趴在偏房一處隱蔽的房頂上張望糠赦。 院中可真熱鬧,春花似錦锅棕、人聲如沸拙泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奔滑。三九已至,卻和暖如春顺少,著一層夾襖步出監(jiān)牢的瞬間朋其,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工脆炎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梅猿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓秒裕,卻偏偏與公主長得像袱蚓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子几蜻,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容