高并发系统处理之——限流
高并發(fā)系統(tǒng)處理之——限流
對于高并發(fā)應(yīng)用服務(wù),有三個很好的方案可以保護(hù)系統(tǒng)
1.緩存 緩存的目的是提升系統(tǒng)訪問速度和增大系統(tǒng)處理容量
2.降級 降級是當(dāng)服務(wù)出現(xiàn)問題或者影響到核心流程時,需要暫時屏蔽掉,待高峰或者問題解決后再打開
3.限流 限流的目的是通過對并發(fā)訪問/請求進(jìn)行限速,或者對一個時間窗口內(nèi)的請求進(jìn)行限速來保護(hù)系統(tǒng),一旦達(dá)到限制速率則可以拒絕服務(wù)、排隊或等待、降級等處理
限流算法
常用的限流算法有兩種:漏桶算法和令牌桶算法
漏桶算法
漏桶算法思路很簡單,水(請求)先進(jìn)入到漏桶里,漏桶以一定的速度出水,當(dāng)水流入速度過大會直接溢出,可以看出漏桶算法能強行限制數(shù)據(jù)的傳輸速率。
對于很多應(yīng)用場景來說,除了要求能夠限制數(shù)據(jù)的平均傳輸速率外,還要求允許某種程度的突發(fā)傳輸。這時候漏桶算法可能就不合適了,令牌桶算法更為適合。
令牌桶算法
令牌桶算法的原理是系統(tǒng)會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當(dāng)桶里沒有令牌可取時,則拒絕服務(wù)。
在google開源的guava工具包中有一個類RateLimiter實現(xiàn)了這個功能,使用比較簡單,使用的是令牌桶算法:
//創(chuàng)建一個1s只能有0.5個請求的限流器(括號里的參數(shù)是1s內(nèi)的請求數(shù)) RateLimiter rateLimiter = RateLimiter.create(0.5);Arrays.asList("123", "456", "789", "1123", "11234").forEach(a -> {//獲取令牌rateLimiter.acquire();System.out.println(a + "------" + System.currentTimeMillis());});打印輸出:
123------1534918207667 456------1534918209625 789------1534918211624 1123------1534918213625 11234------1534918215625后續(xù)再看看源碼。
題外話
除此之外,Java里有個類Semaphore,信號量,可以使得一段代碼同時被多個線程并發(fā)處理。(加sychronized是只有一個線程)
//創(chuàng)建,參數(shù)為可并發(fā)數(shù)量 Semaphore semaphore = new Semaphore(2); //獲取鎖 semaphore.acquire(); //釋放鎖 semaphore.release();總結(jié)
以上是生活随笔為你收集整理的高并发系统处理之——限流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络编程中BIO和NIO的区别
- 下一篇: 高并发缓存处理之——缓存穿透的几种形式及