近期,好多網(wǎng)友提起mq積累的問題啥繁,也不知道他們是工作場景中遇到實(shí)際問題菜职,還是說在面試過程中遇到這樣的問題青抛,因此想知道這個問題答案旗闽。不管是哪種情況吧,那么接下來我就以自然語言的方式與大家輕松的來討論一下mq相關(guān)的東西吧蜜另。
什么是mq?
什么是mq呢适室?其實(shí)相比mq這個叫法,國內(nèi)好多朋友更喜歡叫消息隊列举瑰,既然是這樣的話捣辆,那么想必mq一定是
message
queue的縮寫了,通常mq的工作方式都是委托模式此迅,是一個生產(chǎn)者消費(fèi)者的模式汽畴,一般順序執(zhí)行的程序都是需要耗時的,如果改用使用消息隊列的的話耸序,就可以將一些具體處理業(yè)務(wù)的程序省略掉忍些,直接委托給消息隊列,然后繼續(xù)往下執(zhí)行其他部分坎怪,
然后再委派另一個進(jìn)程去處理消息隊列上的內(nèi)容罢坝,
因此這個過程就可以理解為生產(chǎn)者與消費(fèi)者,生產(chǎn)者只負(fù)責(zé)往消息隊列中添加內(nèi)容搅窿,而消費(fèi)者則負(fù)責(zé)處理消息隊列中的內(nèi)容嘁酿,一個負(fù)責(zé)讓隊列壯大隙券,一個負(fù)責(zé)讓隊列減小。
mq用于解決什么問題闹司?? ?
那么mq用于解決什么樣的問題呢娱仔?在什么樣的場景下比較適合使用mq呢?以我個人的語言來說游桩,mq適合于解決那些高并發(fā)非實(shí)時的問題拟枚,舉個實(shí)際例子,比如發(fā)郵件众弓,在程序中大量用到發(fā)郵件的話恩溅,大家都知道發(fā)郵件程序也是需要耗時的,你在運(yùn)行業(yè)務(wù)程序時谓娃,運(yùn)行到一半的時候脚乡,因?yàn)榘l(fā)郵件程序?qū)е鲁绦蛟谀寝D(zhuǎn)了一小會才繼續(xù)往后執(zhí)行這顯然是體驗(yàn)很不好的,如果再有一定并發(fā)的情況滨达,那簡直是沒法看了奶稠,因此這種情況下就把mq用上,到發(fā)郵件的時候捡遍,不做實(shí)際發(fā)郵件動作锌订,只是委托給消息隊列,在隊列上加入一條消息画株,然后就繼續(xù)執(zhí)行辆飘,這樣的話就大大的增加了體驗(yàn)的流暢度。
為了更進(jìn)一步說明谓传,再舉一個例子蜈项,就以電商的下單系統(tǒng)為例,做過電商的同學(xué)都知道,下單過程是相對復(fù)雜的過程,同時還用到了事務(wù)师妙,要求數(shù)據(jù)無誤差,要同時修改好多張表跑芳,比如有訂單表,訂單商品表直颅,庫存表博个,庫存日志表,訂單日志表等等际乘,顯然這些復(fù)雜的計算是非常耗時的坡倔,如果多個用戶并發(fā)下單的話,顯然對系統(tǒng)造成巨大的壓力,如果實(shí)時計算的話也不太現(xiàn)實(shí)罪塔,再說了用戶下單后投蝉,還要等待漫長的物流,用戶是不會在乎延遲這幾分鐘或者說幾秒鐘不是么征堪?用戶下完訂單后瘩缆,程序只需要告訴用戶下單成功就行,剩下的就把這部分計算業(yè)務(wù)委托給消息隊列就OK了佃蚜,然后讓消費(fèi)者慢慢去消費(fèi)吧庸娱。
mq為什么會產(chǎn)生數(shù)據(jù)堆積?
那么接下來咱們就探討一下谐算,消息隊列為什么會產(chǎn)生積累熟尉?在回答這個問題之前,我做一個我自己認(rèn)為比較形象的比喻吧洲脂,我認(rèn)為消息隊列就是這樣一個水池子斤儿,這個水池子有一個進(jìn)水管,同時也有一個出水管恐锦,進(jìn)水管負(fù)責(zé)往水池進(jìn)水往果,出水管負(fù)責(zé)從水池往外排水,如果說進(jìn)水管比較細(xì)一铅,進(jìn)水能力小陕贮,出水管比較粗,出水能力強(qiáng)的話潘飘,那么是不是水池永遠(yuǎn)都是空的肮之,相反如果進(jìn)水管很粗,進(jìn)水能力很強(qiáng)福也,出水管很細(xì)局骤,排水能力會差攀圈,那么是不是水池的存水量越來越多暴凑,一直到最后溢出,消息隊列也是同樣的道理赘来,當(dāng)生產(chǎn)者能力大于消費(fèi)者的能力時(系統(tǒng)的并發(fā)訪問過高)现喳,勢必會造成數(shù)據(jù)積累,造成消息隊列大量數(shù)據(jù)的堆積犬辰。
如何解決mq堆積問題嗦篱?
上面已經(jīng)對消息隊列的應(yīng)用場景有了說明,產(chǎn)生mq堆積的原因也十分明確了幌缝,那么mq的堆積問題如何解決呢灸促?那答案自然是增加消費(fèi)者的消費(fèi)能力或者降低生產(chǎn)者的生產(chǎn)能力,當(dāng)然降低生產(chǎn)者的生產(chǎn)能力顯然是不現(xiàn)實(shí)呢,你總不能不讓用戶下單吧浴栽,用戶的行為你無法管荒叼,因此要做的只能是增加消費(fèi)者的消費(fèi)能力了,比如增加多個進(jìn)程同時消費(fèi)處理典鸡,比如有3個生產(chǎn)者進(jìn)程在生產(chǎn)被廓,可以設(shè)置10個消費(fèi)者進(jìn)程來消費(fèi),或者更據(jù)具體的業(yè)務(wù)場景或者高效的處理語言與算法來增加消費(fèi)者的消費(fèi)能力萝玷,總之讓生產(chǎn)者生產(chǎn)能力小于消費(fèi)者的消費(fèi)能力嫁乘,通過這種方式就可以逐漸減少消息隊列的數(shù)據(jù)堆積了。
另外球碉,最后要說一點(diǎn)蜓斧,mq只是一個技術(shù)模型,與哪種計算機(jī)語言無關(guān)系睁冬,大多數(shù)語言都可以實(shí)現(xiàn)mq法精,當(dāng)然有的語言會更合適一點(diǎn),對于mq的生產(chǎn)者代碼與mq的消費(fèi)者的代碼痴突,這兩種代碼完全可以是兩種不同的計算機(jī)語言搂蜓,在實(shí)際應(yīng)用場景中,大家根據(jù)實(shí)際的業(yè)務(wù)情況使用最合適的語言辽装,那么關(guān)于mq的討論就暫時聊到這里了帮碰,接下來,關(guān)于mq你還有什么想說的繼續(xù)在評論區(qū)進(jìn)行留言拾积。
以上所有圖片均來之互聯(lián)網(wǎng)? ?
大家好殉挽,我是“上世是朵花”。如果你有什么好的看法或者觀點(diǎn)可以在評論區(qū)展現(xiàn)你的才華拓巧,互動交流斯碌,如果想進(jìn)一步了解我,那就關(guān)注我吧肛度!(微信公眾號:sssdhua )