限流算法目前程序開發(fā)過程常用的限流算法有兩個:漏桶算法和令牌桶算法。
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司與策劃設(shè)計,海州網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:海州等地區(qū)。海州做網(wǎng)站價格咨詢:13518219792
漏桶算法
漏桶算法的原理比較簡單,請求進入到漏桶中,漏桶以一定的速率漏水。當請求過多時,水直接溢出??梢钥闯觯┩八惴梢詮娭葡拗茢?shù)據(jù)的傳輸速度。如圖所示,把請求比作是水滴,水先滴到桶里,通過漏洞并以限定的速度出水,當水來得過猛而出水不夠快時就會導致水直接溢出,即拒絕服務(wù)。
圖片來自網(wǎng)絡(luò)
漏桶的出水速度是恒定的,那么意味著如果瞬時大流量的話,將有大部分請求被丟棄掉(也就是所謂的溢出)。
令牌桶算法
令牌桶算法的原理是系統(tǒng)以一定速率向桶中放入令牌,如果有請求時,請求會從桶中取出令牌,如果能取到令牌,則可以繼續(xù)完成請求,否則等待或者拒絕服務(wù)。這種算法可以應(yīng)對突發(fā)程度的請求,因此比漏桶算法好。
圖片來自網(wǎng)絡(luò)
漏桶算法和令牌桶算法的選擇
兩者的主要區(qū)別漏桶算法能夠強行限制處理數(shù)據(jù)的速率,不論系統(tǒng)是否空閑。而令牌桶算法能夠在限制數(shù)據(jù)的平均處理速率的同時還允許某種程度的突發(fā)流量。如何理解上面的含義呢?漏桶算法,比如系統(tǒng)吞吐量是 120/s,業(yè)務(wù)請求 130/s,使用漏斗限流 100/s,起到限流的作用,多余的請求將產(chǎn)生等待或者丟棄。對于令牌桶算法,每秒產(chǎn)生 100 個令牌,系統(tǒng)容量 200 個令牌。正常情況下,業(yè)務(wù)請求 100/s 時,請求能被正常被處理。當有突發(fā)流量過來比如 200 個請求時,因為系統(tǒng)容量有 200 個令牌可以同一時刻處理掉這 200 個請求。如果是漏桶算法,則只能處理 100 個請求,其他的請求等待或者被丟棄。
可以的,mysql中典型的是mvcc協(xié)議:
MVCC是為了實現(xiàn)數(shù)據(jù)庫的并發(fā)控制而設(shè)計的一種協(xié)議。從直觀理解上來看,要實現(xiàn)數(shù)據(jù)庫的并發(fā)訪問控制,最簡單的做法就是加鎖訪問,即讀的時候不能寫(允許多個西線程同時讀,即共享鎖,S鎖),寫的時候不能讀(一次最多只能有一個線程對同一份數(shù)據(jù)進行寫操作,即排它鎖,X鎖)。這樣的加鎖訪問,其實并不算是真正的并發(fā),或者說它只能實現(xiàn)并發(fā)的讀,因為它最終實現(xiàn)的是讀寫串行化,這樣就大大降低了數(shù)據(jù)庫的讀寫性能。加鎖訪問其實就是和MVCC相對的LBCC,即基于鎖的并發(fā)控制(Lock-Based Concurrent Control),是四種隔離級別中級別最高的Serialize隔離級別。為了提出比LBCC更優(yōu)越的并發(fā)性能方法,MVCC便應(yīng)運而生。
處理高并發(fā)的六種方法
1:系統(tǒng)拆分,將一個系統(tǒng)拆分為多個子系統(tǒng),用dubbo來搞。然后每個系統(tǒng)連一個數(shù)據(jù)庫,這樣本來就一個庫,現(xiàn)在多個數(shù)據(jù)庫,這樣就可以抗高并發(fā)。
2:緩存,必須得用緩存。大部分的高并發(fā)場景,都是讀多寫少,那你完全可以在數(shù)據(jù)庫和緩存里都寫一份,然后讀的時候大量走緩存不就得了。畢竟人家redis輕輕松松單機幾萬的并發(fā)啊。沒問題的。所以你可以考的慮考慮你的項目里,那些承載主要請求讀場景,怎么用緩存來抗高并發(fā)。
3:MQ(消息隊列),必須得用MQ??赡苣氵€是會出現(xiàn)高并發(fā)寫的場景,比如說一個業(yè)務(wù)操作里要頻繁搞數(shù)據(jù)庫幾十次,增刪改增刪改,瘋了。那高并發(fā)絕對搞掛你的系統(tǒng),人家是緩存你要是用redis來承載寫那肯定不行,數(shù)據(jù)隨時就被LRU(淘汰掉最不經(jīng)常使用的)了,數(shù)據(jù)格式還無比簡單,沒有事務(wù)支持。所以該用mysql還得用mysql啊。那你咋辦?用MQ吧,大量的寫請求灌入MQ里,排隊慢慢玩兒,后邊系統(tǒng)消費后慢慢寫,控制在mysql承載范圍之內(nèi)。所以你得考慮考慮你的項目里,那些承載復雜寫業(yè)務(wù)邏輯的場景里,如何用MQ來異步寫,提升并發(fā)性。MQ單機抗幾萬并發(fā)也是ok的。
4:分庫分表,可能到了最后數(shù)據(jù)庫層面還是免不了抗高并發(fā)的要求,好吧,那么就將一個數(shù)據(jù)庫拆分為多個庫,多個庫來抗更高的并發(fā);然后將一個表拆分為多個表,每個表的數(shù)據(jù)量保持少一點,提高sql跑的性能。
5:讀寫分離,這個就是說大部分時候數(shù)據(jù)庫可能也是讀多寫少,沒必要所有請求都集中在一個庫上吧,可以搞個主從架構(gòu),主庫寫入,從庫讀取,搞一個讀寫分離。讀流量太多的時候,還可以加更多的從庫。
6:solrCloud:
SolrCloud(solr 云)是Solr提供的分布式搜索方案,可以解決海量數(shù)據(jù)的 分布式全文檢索,因為搭建了集群,因此具備高可用的特性,同時對數(shù)據(jù)進行主從備份,避免了單點故障問題??梢宰龅綌?shù)據(jù)的快速恢復。并且可以動態(tài)的添加新的節(jié)點,再對數(shù)據(jù)進行平衡,可以做到負載均衡:
方法一:進入MYSQL安裝目錄 打開MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改為 max_connections=1000 服務(wù)里重起MYSQL即可
方法二:MySQL的最大連接數(shù)默認是100客戶端登錄:mysql -uusername -ppassword
設(shè)置新的最大連接數(shù)為200:mysql set GLOBAL max_connections=200
顯示當前運行的Query:mysql show processlist
顯示當前狀態(tài):mysql show status
退出客戶端:mysql exit
查看當前最大連接數(shù):mysqladmin -uusername -ppassword variables