Java架構(gòu)師筆記丨老板讓你抗住千萬(wàn)級(jí)流量,如何做架構(gòu)設(shè)計(jì)酪我?

隨著互聯(lián)網(wǎng)的發(fā)展消痛,各項(xiàng)軟件的客戶量日益增多,當(dāng)客戶量達(dá)到一定峰值時(shí)都哭,當(dāng)數(shù)以萬(wàn)計(jì)的流量來(lái)臨時(shí)秩伞,程序的順利運(yùn)行以及即時(shí)響應(yīng)則顯得尤為重要,就像雙11那天的淘寶一樣欺矫。那么纱新,如何設(shè)計(jì)架構(gòu)才能夠抗住這千萬(wàn)級(jí)的流量。

老板讓你抗住千萬(wàn)級(jí)流量穆趴,如何做架構(gòu)設(shè)計(jì)脸爱?

首先,要在我們架構(gòu)設(shè)計(jì)的時(shí)候建立一些原則未妹。

1. 實(shí)現(xiàn)高并發(fā)

服務(wù)拆分:將整個(gè)項(xiàng)目拆分成多個(gè)子項(xiàng)目或者模塊簿废,分而治之,將項(xiàng)目進(jìn)行水平擴(kuò)展络它。

服務(wù)化:解決服務(wù)調(diào)用復(fù)雜之后的服務(wù)的注冊(cè)發(fā)現(xiàn)問(wèn)題捏鱼。

消息隊(duì)列:解耦,異步處理

緩存:各種緩存帶來(lái)的并發(fā)

2. 實(shí)現(xiàn)高可用

集群酪耕、限流、降級(jí)

3. 業(yè)務(wù)設(shè)計(jì)

冪等:就是用戶對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的轨淌,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用迂烁,就像數(shù)學(xué)里的數(shù)字1看尼,多少次冪的結(jié)果都是1。舉個(gè)最簡(jiǎn)單的例子盟步,那就是支付藏斩,用戶購(gòu)買商品后支付,支付扣款成功却盘,但是返回結(jié)果的時(shí)候網(wǎng)絡(luò)異常狰域,此時(shí)錢已經(jīng)扣了,用戶再次點(diǎn)擊按鈕黄橘,此時(shí)會(huì)進(jìn)行第二次扣款兆览,返回結(jié)果成功,用戶查詢余額發(fā)現(xiàn)多扣錢了塞关,流水記錄也變成了兩條抬探。

防重:防止同樣的數(shù)據(jù)同時(shí)提交

除了在業(yè)務(wù)方向判斷和按鈕點(diǎn)擊之后不能繼續(xù)點(diǎn)擊的限制以外,在服務(wù)器端也可以做到防重:

在服務(wù)器端生成一個(gè)唯一的隨機(jī)標(biāo)識(shí)號(hào)(Token<令牌>)同事在當(dāng)前用戶的Session域中保存這個(gè)令牌帆赢,然后將令牌發(fā)送到客戶端的form表單中小压,在form表單中使用隱藏域來(lái)存儲(chǔ)這個(gè)Token,表單提交的時(shí)候聯(lián)通這個(gè)Token一起提交到服務(wù)器椰于,然后在服務(wù)器端判斷客戶提交上來(lái)的Token與服務(wù)器端生成的Token是否一致怠益,如果不一致,那就重復(fù)提交了瘾婿,此時(shí)服務(wù)器端就可以不處理重復(fù)提交的表單蜻牢,如果相同則處理表單,處理完后清楚當(dāng)前用戶的Session域中存儲(chǔ)的標(biāo)識(shí)號(hào)憋他。高可用高并發(fā)架構(gòu)參考:高可用高并發(fā)的 9 種技術(shù)架構(gòu)孩饼。

在下列情況中,服務(wù)器程序?qū)⒕芙^處理用戶提交的表單請(qǐng)求:

1)存儲(chǔ)Session域中的Token與表單提交的Token不一致

2)當(dāng)前用戶的Session中不存在Token

3)用戶提交的表單數(shù)據(jù)中沒(méi)有Token。

狀態(tài)機(jī)

軟件設(shè)計(jì)中的狀態(tài)機(jī)概念驼鞭,一般是指有限狀態(tài)機(jī)(英語(yǔ):finite-state machine猩谊,縮寫(xiě):FSM)又稱有限狀態(tài)自動(dòng)機(jī),簡(jiǎn)稱狀態(tài)機(jī)梯码,是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型。

這里著重講一下限流的概念和例子

限流的目的

限流的目的是通過(guò)對(duì)并發(fā)訪問(wèn)/請(qǐng)求進(jìn)行限速或者一個(gè)時(shí)間窗口內(nèi)的請(qǐng)求進(jìn)行限速來(lái)保護(hù)系統(tǒng)的可用性好啰,一旦達(dá)到限制速率就可以拒絕服務(wù)轩娶。就像手機(jī)預(yù)售一樣,假如要賣出3萬(wàn)臺(tái)框往,只需要接收3萬(wàn)用戶的請(qǐng)求就可以鳄抒,其他的用戶請(qǐng)求可以選擇過(guò)濾,可以提示"當(dāng)前服務(wù)器過(guò)忙,請(qǐng)稍后再試"的提示许溅。推薦大家看這篇文章:接口限流算法:漏桶算法&令牌桶算法瓤鼻。

限流方式:

1. 限制瞬時(shí)并發(fā)數(shù) : 比如在入口層(nginx添加nginx_http_limit_conn_module)來(lái)限制同一個(gè)ip來(lái)源的連接數(shù),防止惡意攻擊訪問(wèn)的情況贤重。

2. 限制總并發(fā)數(shù):通過(guò)配置數(shù)據(jù)庫(kù)連接池茬祷、線程池大小來(lái)約束總并發(fā)數(shù)

3. 限制時(shí)間窗口內(nèi)的平均速率:在接口層面,通過(guò)限制訪問(wèn)速率來(lái)控制接口的并發(fā)請(qǐng)求并蝗。

4. 其他方式:限制遠(yuǎn)程接口的調(diào)用速率祭犯、限制MQ的消費(fèi)速率。

常用限流算法

1. 滑動(dòng)窗口協(xié)議:一種常見(jiàn)的流量控制技術(shù)滚停,用來(lái)改善吞吐量的技術(shù)沃粗。

滑動(dòng)窗口協(xié)議的由來(lái):

滑動(dòng)窗口(sliding window)是一種流量控制技術(shù)。早期的網(wǎng)絡(luò)通訊中铐刘,通信雙方不會(huì)考慮網(wǎng)絡(luò)的擁擠情況直接發(fā)送數(shù)據(jù)陪每。由于大家不知道網(wǎng)絡(luò)擁塞狀況,同時(shí)發(fā)送數(shù)據(jù)镰吵,導(dǎo)致中間節(jié)點(diǎn)阻塞掉包檩禾,誰(shuí)也發(fā)送不了數(shù)據(jù),所以就有了滑動(dòng)窗口機(jī)制來(lái)解決此問(wèn)題疤祭。 發(fā)送和接收方都會(huì)維護(hù)一個(gè)數(shù)據(jù)幀的序列盼产,這個(gè)序列被稱為窗口。

定義:滑動(dòng)窗口協(xié)議(Sliding Window Protocol)勺馆,屬于TCP協(xié)議的一種應(yīng)用戏售,用于網(wǎng)絡(luò)數(shù)據(jù)傳輸時(shí)的流量控制,以避免擁塞的發(fā)生草穆。該協(xié)議允許發(fā)送方在停止并等待確認(rèn)前發(fā)送多個(gè)數(shù)據(jù)分組灌灾。由于發(fā)送方不必每發(fā)一個(gè)分組就停下來(lái)等待確認(rèn),因此該協(xié)議可以加速數(shù)據(jù)的傳輸悲柱,提高網(wǎng)絡(luò)吞吐量锋喜。

發(fā)送窗口:就是發(fā)送端允許連續(xù)發(fā)送的幀的序號(hào)表。發(fā)送端可以不等待應(yīng)答而連續(xù)發(fā)送數(shù)據(jù)(可以通過(guò)設(shè)置窗口的尺寸來(lái)控制)

接收窗口:接收方允許接收的幀的序列表豌鸡,凡是落在接收窗口內(nèi)的幀嘿般,接收方都必須處理,落在接收窗口外的幀將被丟棄涯冠。接收方每次允許接收的幀數(shù)稱為接收窗口的尺寸

2. 漏桶:漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率炉奴。

漏桶算法思路很簡(jiǎn)單,請(qǐng)求先進(jìn)入到漏桶里蛇更,漏桶以一定的速度出水瞻赶。當(dāng)水請(qǐng)求過(guò)大會(huì)直接溢出赛糟,可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率。進(jìn)入端無(wú)需考慮出水端的速率砸逊,就像mq消息隊(duì)列一樣虑灰,provider只需要將消息傳入隊(duì)列中,而不需要關(guān)心Consumer是否接收到了消息痹兜。

對(duì)于溢出的水,就是被過(guò)濾的數(shù)據(jù)颤诀,可以直接被丟棄字旭,也可以通過(guò)某種方式暫時(shí)保存,如加入隊(duì)列之中崖叫,像線程池里對(duì)溢出數(shù)據(jù)的4種處理機(jī)制一樣

3. 令牌桶:屬于控制速率類型的限流算法遗淳。

對(duì)于很多應(yīng)用場(chǎng)景來(lái)說(shuō),除了要求能夠限制數(shù)據(jù)的平均傳輸速率外心傀,還要求允許某種程度的突發(fā)傳輸屈暗。這時(shí)候漏桶算法可能就不合適了,令牌桶算法更為適合脂男。令牌桶算法的原理是系統(tǒng)會(huì)以一個(gè)恒定的速度往桶里放入令牌养叛,而如果請(qǐng)求需要被處理,則需要先從桶里獲取一個(gè)令牌宰翅,當(dāng)桶里沒(méi)有令牌可取時(shí)弃甥,則拒絕服務(wù)。

設(shè)置 Rate = 2 :每秒放入令牌的個(gè)數(shù)

桶的大兄稀:100

這里用一個(gè)小demo來(lái)實(shí)現(xiàn)一下令牌桶

public class TokenDemo {

//qps:每秒鐘處理完請(qǐng)求的次數(shù)淆攻;tps:每秒鐘處理完的事務(wù)次數(shù)

//代表qps是10;

RateLimiter rateLimiter = RateLimiter.create(10);

public void doSomething(){

if (rateLimiter.tryAcquire()){

//嘗試獲得令牌.為true則獲取令牌成功

System.out.println("正常處理");

}else{

System.out.println("處理失敗");

}

}

public static void main(String args[]) throws IOException{

/*

* CountDownLatch是通過(guò)一個(gè)計(jì)數(shù)器來(lái)實(shí)現(xiàn)的嘿架,計(jì)數(shù)器的初始值為線程的數(shù)量瓶珊,此值是線程將要等待的操作數(shù)(線程的數(shù)量)。

* 當(dāng)某個(gè)線程為了想要執(zhí)行這些操作而等待時(shí)耸彪, 它要使用 await()方法伞芹。

* 此方法讓線程進(jìn)入休眠直到操作完成。

* 當(dāng)某個(gè)操作結(jié)束搜囱,它使用countDown() 方法來(lái)減少CountDownLatch類的內(nèi)部計(jì)數(shù)器丑瞧,計(jì)數(shù)器的值就會(huì)減1。

* 當(dāng)計(jì)數(shù)器到達(dá)0時(shí)蜀肘,它表示所有的線程已經(jīng)完成了任務(wù)绊汹,這個(gè)類會(huì)喚醒全部使用await() 方法休眠的線程們恢復(fù)執(zhí)行任務(wù)。

*

* */

CountDownLatch latch = new CountDownLatch(1);

Random random = new Random(10);

TokenDemo tokenDemo = new TokenDemo();

for (int i=0;i<20;i++){

new Thread(()->{

try {

latch.await();

Thread.sleep(random.nextInt(1000));

tokenDemo.doSomething();

}catch (InterruptedException e){

e.printStackTrace();

}

}).start();

}

latch.countDown();

System.in.read();

}

}

執(zhí)行結(jié)果:

正常處理

正常處理

正常處理

正常處理

正常處理

處理失敗

正常處理

處理失敗

處理失敗

處理失敗

正常處理

處理失敗

正常處理

處理失敗

正常處理

正常處理

正常處理

正常處理

處理失敗

處理失敗

由此可見(jiàn)扮宠,當(dāng)令牌不足時(shí)西乖,會(huì)獲取令牌失敗狐榔,達(dá)到限流的效果。

4. 計(jì)數(shù)器:最簡(jiǎn)單的一種获雕。通過(guò)控制時(shí)間段內(nèi)的請(qǐng)求次數(shù)薄腻。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? —— e n d ——

多寫(xiě)多敲代碼,好的代碼與扎實(shí)的基礎(chǔ)知識(shí)一定是實(shí)踐出來(lái)的

推薦:Java高級(jí)開(kāi)發(fā),Java架構(gòu)師/大型互聯(lián)網(wǎng)架構(gòu)進(jìn)階直播

地址:http://t.cn/AiKfJ6Zx?(點(diǎn)我)

(復(fù)制鏈接到瀏覽器即可)

看到這里届案,說(shuō)明你喜歡本文庵楷,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完楣颠。希望此文能幫到大家的同時(shí)尽纽,也聽(tīng)聽(tīng)大家的觀點(diǎn)。你的轉(zhuǎn)發(fā)童漩,是對(duì)我最大的鼓勵(lì)弄贿!在看亦是支持↓

歡迎留言、討論矫膨、關(guān)注差凹、收藏、分享你的高見(jiàn)侧馅!持續(xù)更新危尿!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市施禾,隨后出現(xiàn)的幾起案子脚线,更是在濱河造成了極大的恐慌,老刑警劉巖弥搞,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邮绿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡攀例,警方通過(guò)查閱死者的電腦和手機(jī)船逮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粤铭,“玉大人挖胃,你說(shuō)我怎么就攤上這事“鸸撸” “怎么了酱鸭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)垛吗。 經(jīng)常有香客問(wèn)我凹髓,道長(zhǎng),這世上最難降的妖魔是什么怯屉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任蔚舀,我火速辦了婚禮饵沧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赌躺。我一直安慰自己狼牺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布礼患。 她就那樣靜靜地躺著是钥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缅叠。 梳的紋絲不亂的頭發(fā)上咏瑟,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音痪署,去河邊找鬼。 笑死兄旬,一個(gè)胖子當(dāng)著我的面吹牛狼犯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播领铐,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悯森,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绪撵?” 一聲冷哼從身側(cè)響起瓢姻,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音诈,沒(méi)想到半個(gè)月后幻碱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡细溅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年褥傍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇聊。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恍风,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出誓篱,到底是詐尸還是另有隱情朋贬,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布窜骄,位于F島的核電站锦募,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啊研。R本人自食惡果不足惜御滩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一鸥拧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧削解,春花似錦富弦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至矫废,卻和暖如春盏缤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓖扑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工唉铜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人律杠。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓潭流,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柜去。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灰嫉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359