怎樣才能自學(xué)Java集合框架?自己看源碼能否學(xué)成?
收集框架相當(dāng)簡單。如果你努力學(xué)習(xí),肯定是可以的。集合應(yīng)該屬于JAVAS
Java互聯(lián)網(wǎng)架構(gòu)-如何設(shè)計(jì)服務(wù)接口API限流功能?
1限流的目的限流的目的是保護(hù)系統(tǒng)。當(dāng)訪問量劇增,超過系統(tǒng)所能承受的流量時(shí),就要把多余的流量屏蔽掉,直接返回,沒有業(yè)務(wù)邏輯。
2壓力測量法用于估算系統(tǒng)流量的上限。對(duì)一個(gè)接口進(jìn)行壓力測試,逐漸增加并發(fā)量和持續(xù)時(shí)間,當(dāng)并發(fā)量達(dá)到系統(tǒng)瓶頸(錯(cuò)誤率高,響應(yīng)時(shí)間長)時(shí),記錄并發(fā)量。該值是當(dāng)前系統(tǒng)流量的上限。
3限流方案3.1系統(tǒng)維度分為單機(jī)限流和集群限流兩種。
單機(jī)限流就是限制每臺(tái)機(jī)器的電流。假設(shè)每臺(tái)機(jī)器的電流限制為100QPS,集群有10臺(tái)機(jī)器,則整個(gè)集群的容量為1000QPS。可以用GuavaRateLimiter,Java,契約信號(hào)量實(shí)現(xiàn)單機(jī)限流。
集群限流是限制整個(gè)集群的電流,比如估計(jì)整個(gè)集群的容量是1000QPS,還有一種場景是限制次數(shù),比如整個(gè)集群只能調(diào)用第三方接口多少次。Redis可用于實(shí)現(xiàn)完全受限流。
3.2方法維度限流常見的方法有三種:
counter方法維護(hù)一個(gè)計(jì)數(shù)器,它有一個(gè)時(shí)間窗口。在當(dāng)前時(shí)間窗口內(nèi),每當(dāng)有新的請(qǐng)求到來時(shí),計(jì)數(shù)器就會(huì)自行增加,當(dāng)計(jì)數(shù)器自行增加到設(shè)定的上限時(shí),就不再提供服務(wù)。當(dāng)滑動(dòng)到下一個(gè)時(shí)間窗口時(shí),計(jì)數(shù)器復(fù)位。這個(gè)方法簡單,但是在時(shí)間窗的臨界點(diǎn),可能會(huì)出現(xiàn)超流的問題。
漏桶漏桶強(qiáng)制恒定的輸出速率,而不管輸入數(shù)據(jù)流的突發(fā)性如何。當(dāng)輸入空閑時(shí),算法不執(zhí)行任何動(dòng)作,就像用底部有洞的漏桶接水一樣。水進(jìn)入漏桶,桶里的水通過下面的孔以固定的速度流出。當(dāng)水的流入速度過快時(shí),會(huì)直接溢出。
令牌桶算法我推薦這個(gè)方法。具有固定容量的桶以恒定的速率生成令牌。如果桶中的令牌已滿,多余的令牌將被丟棄。每當(dāng)有請(qǐng)求進(jìn)來,先去桶里拿個(gè)令牌。當(dāng)桶中的令牌完成時(shí),您必須等待桶中生成令牌,然后才允許后續(xù)請(qǐng)求(或者直接拒絕它)。因?yàn)橥爸锌梢岳鄯e一定量的令牌(一般是桶容量),令牌桶算法的優(yōu)點(diǎn)是可以允許一定量的流量峰值。
Guava提供了一個(gè)電流限制工具RateLimit。Er基于令牌桶完成限流。還可以通過編寫Lua腳本,通過Redis實(shí)現(xiàn)一個(gè)全局令牌桶。