成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

信號量限流,高并發場景不得不說的秘密

開發 前端
限流可以認為是一種降級,一般是根據后臺的負載提前預估的一個閾值(也可以動態調整)。超過了這個值,就要進行一些旁路處理。根據業務形態,會有直接拒絕、延遲處理、保持等待、部分穿透、默認返回等響應方式。

 限流可以認為是一種降級,一般是根據后臺的負載提前預估的一個閾值(也可以動態調整)。超過了這個值,就要進行一些旁路處理。根據業務形態,會有直接拒絕、延遲處理、保持等待、部分穿透、默認返回等響應方式。

concurrent包中的信號量,由于使用簡單,易于理解,被廣泛應用。但是,你要是直接用了網友們分享的簡單代碼而不經過認真測試,那可以送你一部電影觀賞一下:《當故障來敲門》。

看下面簡單的代碼,acquire和release是一對同命鴛鴦,我們把release貼心的放在了finally塊中,一切顯得非常和諧。

1)模擬的業務請求,耗時大約是100毫秒

2)acquire的參數5代表同一時間允許5個線程進行處理

3)每次執行完畢,輸出一下本次執行的具體耗時,加上等待時間

 

我們啟動1000個線程去執行req方法。

  1. SemaphoreLimiterBadChecker limiter = new SemaphoreLimiterBadChecker(); 
  2. ExecutorService executor = Executors.newCachedThreadPool(); 
  3. for (int i = 0; i < 1000; i++) { 
  4.     executor.submit(() -> { 
  5.         while (true) { 
  6.             System.out.println(limiter.req()); 
  7.         } 
  8.     }); 

下面是執行結果。

 

可以看到,雖然我們的接口耗時只有100ms,實際的執行時間,卻長的多,而且并沒有出現fail的情況。運行稍長一點時間,能夠發現有大量的線程處于餓死的狀態。改為公平鎖并不能改善這一情況。

 

這就是故障。

原因就在于。web端(如tomcat)的資源也是有限的。當我們的限流器產生了作用,而實際并發請求比處理能力高的時候,這種線程阻塞情況就會逐級傳遞。服務器的響應可能會有以下過程:

1)壓力普通,正常服務,耗時正常 。

2)壓力上升,服務開始出現大面積超時,由于使用不公平鎖競爭,偶爾會有正常耗時的請求。

3)壓力繼續增大,服務器開始進入假死狀態,幾乎不能再接受新的請求。

 

表現在用戶端,既不能出現服務不能處理的提示,也無法中斷請求,所有的請求都在轉圈。繼續加大tomcat的連接數和線程數,并不會起到多大的作用。

把acquire改成tryAcquire?依然不能解決問題。tryAcquire返回的是bool類型,失敗的時候依然能夠往下執行,包括finally塊。有個毛用?

  1. if(!tryAcquire()){ 
  2.     return TOO_MANY_REQUESTS; 

上面多加了一個判斷,這個才是正途。tryAcquire還可以加超時參數,不至于立馬返回失敗,也不至于讓調用者無限等待,而是將成功的請求控制在一個合理的響應時間。

響應時間=超時時間+業務處理時間

 

具體做法,拿spring來說,你可以在preHandle中獲取這個許可,然后在postHandle中釋放它;也可以使用定時器以一定的頻率去重制信號量。

當然你也要區別對待。

1、像上面提到的web服務,可以直接拒絕服務。快速響應才是重要的

2、像一些秒殺、下單等,可以通過排隊或者等待解決(部分的)

3、像消息消費等,如果沒有順序需求,我覺得,無限等待還可能是個好的方式

4、對于大多數可有可無的業務結果,使用一些默認值直接返回,效果會好的多。雖然是限流,但干的是熔斷的活

使用者一定要注意區分。

End

非常讓人奇怪的是,java抽象了使用場景并不是很高(相對)的CyclicBarrier,但是并沒有一個通用的限流方法。信號量雖然可以模擬實現這個過程,但它不太友好,太容易出錯。限流還是使用guava的組件進行控制比較好(非分布式),我們會在后面的文章來探討它。

責任編輯:武曉燕 來源: 小姐姐味道
相關推薦

2019-10-18 17:55:03

安全運營

2011-04-26 09:44:05

Power Cloud

2019-12-24 14:04:59

PythonExcel數據處理

2020-06-15 08:19:00

ZooKeeperEureka

2019-11-14 15:38:46

AndroidRelease項目

2015-08-31 14:12:12

DockerKubernetesPaaS

2018-08-06 11:59:00

混合云數據中心上云

2010-05-26 15:17:06

Windows Emb

2024-02-04 00:00:03

運維Linux磁盤

2014-10-21 11:05:52

英特爾Linux

2015-01-16 16:44:50

2014-04-15 10:18:24

中文女工科男

2010-08-27 10:37:43

無線標準WAPI

2012-10-31 10:07:00

JS前端Web

2012-10-31 10:36:17

js前端JavaScript頁面構建

2011-04-27 10:31:29

兼容墨盒用戶體驗

2019-10-21 10:18:29

區塊鏈大數據

2018-08-20 13:39:15

小程序設計UI設計師

2010-01-07 09:17:57

HTML 5

2009-06-26 11:01:38

new和delete
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人影院在线 | 99综合| 欧美婷婷 | 国产一级视频在线 | 久久91 | 久久精品国产亚洲 | 国产精品伦理一区二区三区 | 一区 | 中文一级片 | 91 视频网站 | 日韩精品一区二区三区视频播放 | yiren22综合网成人 | 毛片网在线观看 | 国产乱码高清区二区三区在线 | 国产超碰人人爽人人做人人爱 | 91久久久精品国产一区二区蜜臀 | julia中文字幕久久一区二区 | 日韩av电影在线观看 | 免费在线观看av的网站 | 精品国产乱码久久久久久88av | 亚洲精彩视频 | 国产日韩欧美 | 日韩成人在线电影 | 国产高清视频在线观看播放 | 91香蕉嫩草 | 麻豆久久精品 | 久久精品一区二 | 国产精品免费一区二区三区四区 | 亚洲欧美国产精品久久 | 久久久久久久久久久高潮一区二区 | 日韩视频精品在线 | 午夜爽爽男女免费观看hd | 中文字幕日韩三级 | 在线观看免费黄色片 | 久久精品二区 | 日韩国产中文字幕 | 国产亚洲www | 国产视频在线观看一区二区三区 | 国产精品一区二区久久 | 韩日一区| 亚洲欧美中文日韩在线v日本 |