<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          常見面試題,消息堆積了怎么辦?

          共 1407字,需瀏覽 3分鐘

           ·

          2022-07-09 19:32


          點(diǎn)擊上方藍(lán)字“設(shè)為星標(biāo)”



          大家好,我是【架構(gòu)擺渡人】,一只十年的程序猿。這是消息隊(duì)列的第八篇文章,這個(gè)系列會(huì)給大家分享很多在實(shí)際工作中有用的經(jīng)驗(yàn),如果有收獲,還請分享給更多的朋友。
           
          這個(gè)問題在面試中出現(xiàn)的概率極高,這也是面試官考察你是否在工作中有過實(shí)際解決問題的能力。當(dāng)然也不一定每個(gè)人都能遇到這個(gè)問題,即使遇不到,我們也要對這些問題的解決方式了然于胸。
           
          如果你被問到這個(gè)問題,可以從兩個(gè)方面來回答。一個(gè)是前置的預(yù)防,另一個(gè)是發(fā)生后的處理過程。
           


          前置預(yù)防




          前置預(yù)防,我們需要有強(qiáng)大的監(jiān)控體系。當(dāng)某個(gè)Topic中消息堆積的量到達(dá)一定程度,那么此時(shí)要能夠及時(shí)告警,早點(diǎn)介入進(jìn)去。
           
          另一個(gè)就是平時(shí)要監(jiān)控消費(fèi)的速度和耗時(shí),如果消費(fèi)耗時(shí)突然變高了,也要及時(shí)關(guān)注,有可能是因?yàn)榈倪^程中不斷的加邏輯,沒有進(jìn)行優(yōu)化,導(dǎo)致處理時(shí)間越來越長。處理時(shí)間變長,那么也就意味著消費(fèi)的吞吐量會(huì)下降。
           
          其次,還需要監(jiān)控消息的發(fā)送方速度,平時(shí)發(fā)送的TPS也就1000左右,能夠被正常消費(fèi),幾乎沒有消息堆積。但是有天突然消息的發(fā)送TPS慢慢的增長了5000,此時(shí)必然消費(fèi)不過來,隨著時(shí)間的推移,消息必然出現(xiàn)堆積情況。

          過程處理





          消息可丟棄

          對于消息可以丟棄的處理方式非常簡單,一般有2種方式。
           
          第一種:消費(fèi)的代碼中增加一個(gè)開關(guān),當(dāng)開關(guān)開啟的時(shí)候不進(jìn)行業(yè)務(wù)邏輯的處理,這樣相當(dāng)于消費(fèi)的RT是0ms,堆積的消息很快就會(huì)被消費(fèi)完的。然后再把開關(guān)關(guān)掉,開始正常的消費(fèi)邏輯。
           
          第二種:利用MQ自帶的功能,重置消費(fèi)點(diǎn)的位置。一般都是可以基于時(shí)間來進(jìn)行重置,你可以直接重置到當(dāng)前的這一分鐘,也就是當(dāng)前時(shí)間之前的消息都會(huì)被跳過,這樣也能快速恢復(fù)正常的消費(fèi)。

           

          消息不能丟

          對于消息不能丟的場景,只能從消費(fèi)速度去提升了,這樣才能盡快將堆積的消息消費(fèi)掉。
           
          第一種:增加消費(fèi)線程數(shù)量,讓消費(fèi)盡可能并發(fā)處理,但是一定得考慮消費(fèi)邏輯的問題,如果消費(fèi)邏輯里面是對數(shù)據(jù)庫進(jìn)行操作,那么得看數(shù)據(jù)庫的性能是否能夠扛住這些并發(fā),否則數(shù)據(jù)也需要臨時(shí)進(jìn)行擴(kuò)容。
           
          第二種:如果每個(gè)消費(fèi)的線程數(shù)已經(jīng)很大了,這個(gè)時(shí)候需要對消費(fèi)者的節(jié)點(diǎn)進(jìn)行擴(kuò)容了。說白了就是之前10個(gè)人在搬磚,現(xiàn)在多加10個(gè)人,速度自然就上來了。
           
          但是搬磚也是有規(guī)矩的,就是整個(gè)工地會(huì)劃分為多個(gè)塊,每個(gè)人負(fù)責(zé)搬一個(gè)塊,如果只有15個(gè)塊,即使有20個(gè)人也沒辦法加速,所以要把塊分多一點(diǎn),讓每個(gè)人都能搬一個(gè)塊這樣效率才會(huì)高。
           
          同理,在MQ中一個(gè)Topic的消息會(huì)存儲(chǔ)在多個(gè)Queue中,一個(gè)Queue只會(huì)被一個(gè)消費(fèi)者消費(fèi),所以如果增加消費(fèi)者之后速度還是上不來,就需要新建一個(gè)Queue數(shù)量多的Topic來接收之前堆積的消息,這樣加大消費(fèi)者數(shù)量才能提高消費(fèi)速度。

           

          總結(jié)




          導(dǎo)致消息堆積的原因有很多,我們需要沉著冷靜的去分析為是什么原因?qū)е铝讼⒍逊e。是消費(fèi)速度慢導(dǎo)致的,還是消費(fèi)速度挺快,但是生產(chǎn)速度太快了,實(shí)在是更不上導(dǎo)致的,還是說MQ的重平衡邏輯有bug導(dǎo)致某些Queue沒有被消息產(chǎn)生的堆積。我們只有了解了背后的原因才能選擇合適的解決方案。
           

           

          原創(chuàng):架構(gòu)擺渡人(公眾號(hào)ID:jiagoubaiduren),歡迎分享,轉(zhuǎn)載請保留出處。

           


          瀏覽 31
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美久久国产精品 | 日本午夜福利中文字幕 | 在线a黄网站 | 北条麻妃被两个黑人玩 | 思思热免费 |