95後程序猿小A
現在大型網站架構技術中,有一個高頻詞就是“消息中間件”,我們在很多大公司分享的技術PPT或者崗位要求裡都會看到這個名詞。什麼是消息中間件呢以及它能解決什麼問題呢?
什麼是消息中間件?
通過消息中間件可以讓不同的系統模塊通過傳遞消息的方式來激活對方的事件以完成相應的操作。消息中間件本質上也算是一種隊列,支持同步或異步方式來傳輸消息。
一般情況下我們把消息中間件簡稱為MQ。
消息中間件在架構中發揮了重要作用
通過消息中間件可以幫我們解決很多問題,比如說:
1、系統解耦
比如一個用戶註冊流程,可能涉及這些操作:
向用戶庫中寫入數據;
向相關附加表中寫入數據;
發送歡迎短信、郵件、站內信等。
2、異步調用
上面舉的會員註冊的例子同樣適用於此處,同步阻塞式調用會使得調用鏈時間週期過長,而異步調用極大的縮短了調用鏈的時間。
3、隊列緩衝
消息中間件就像一個蓄水池,可將大量請求存儲下來讓後臺逐一處理,所以像秒殺系統都少不了消息系統。
主流的消息中間件產品
現在市面上有很多消息中間件,應用最為廣泛的主要有:RabbitMQ、Kafka、RocketMQ、ActiveMQ等。
網絡圈
現在很多系統都引入的消息中間件,我們公司現在也有基於RabbitMQ的消息中間件平臺,如果項目需要使用的MQ的話,只需要申請即可;那麼引入消息中間件是為了解決什麼問題,我談談自己的看法:
異步調用
我們有很多業務系統,實際上實時性要求並沒有那麼高,完全是可以進行異步調用的。
我曾經做過一個系統是客服通知性質的系統,比如客戶十天後需要繳費了,那麼我們會根據原始數據+模板,生成短信通知,然後發送給短信平臺進行短信發送。這個短信平臺提供了一個接口,其他系統如果想要發送短信的話,只要把手機號+短信內容通過接口發送給短信平臺,再由短信平臺和各個服務商進行對接。這個場景就非常適合改成異步調用,只需要把待發送短信扔到消息隊列中,再由短信平臺取出待發送短信,進行發送。
再舉個例子,如果一個服務有調用鏈路,比如A->B->C,假如A調B速度很快,但是B調C速度較慢或不穩定,那麼可以評估一下C是不是可以做異步調用,這樣可以在不影響業務流程的前提下,加快服務的響應速度。
系統解耦
不知道大家有沒有遇到過這樣的問題,A系統有一些數據,B系統需要這些數據。
一種方法是B系統調用A系統的接口進行查詢,但是由於數據的狀態可能會發生變化,B系統需要在數據變化的時候做一些業務操作,這時候需要A系統在數據有變化的時候,主動通知B系統;那麼可以B系統提供一個接口,A系統主動通知;這樣做實現起來沒有問題,但是困難也比較大:
- 通知過程中有問題,比如B系統down掉了、B系統在發佈,那麼A系統需要考慮重發的問題;
- 如果數據多、變化快,那麼會對B系統帶來很大的壓力(不停地進行接口調用);
- C系統說,我也想要這些數據,我也做個接口你通知一下我吧;
- DEFG系統說...我也想要...A系統開發猝...
那麼最好的解決方案是:A系統將數據發送到MQ中,哪些系統需要的話,就去消費(需要被授權);如果哪天某個系統下線了,就取消消費。
流量緩衝
我們之前做過的一個項目,大概功能是這樣的。(秒殺系統經常會用到,但是因為這個系統是我們一個實際項目,所以就用這個項目舉例了)
A系統對外提供接口,有內網系統調用,也有互聯網端的系統調用;互聯網端的流量不好估計,如果接口壓力過大的話,很有可能把A系統壓垮,從而影響到業務流程。於是我們在A系統和互聯網端之間,增加了一層,功能也很簡單,接收到請求之後,直接扔到MQ中,再由一個程序勻速地從MQ裡面拿請求出來,調用A系統;這樣就起到了一個流量緩衝的作用。(並沒有讓互聯網端的系統和A系統改造,他們唯一要做的就是改一下接口地址)。
能想到也就這麼多了,歡迎大家補充。
希望我的回答,能夠幫助到你!我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。
會點代碼的大叔
消息中間件,在目前主流的架構中已經成了不可或缺的一部分,作用的話無外乎這幾種:解耦、異步、削峰限流,達到系統的高可用。目前比較主流的消息中間件有Kafka、RabbitMQ、ActiveMQ、RocktMQ等,Redis也可以做消息中間件哦,具體可根據實際使用場景來選擇。下面我們來看下這幾個主要作用,
1、系統解耦
解決的問題就是N個系統糅合在一起,相互調用,一團糟,如下圖
然後,我們進行系統的改造,加入消息中間件來理清楚上面這些紛紛擾擾的關聯,
這樣是不是很清晰了,系統之間不會耦合在一起了,就達到了解耦的效果,在分佈式的大型系統中,這個功能尤為重要。
2、異步調用
異步調用,主要解決的是同步阻塞和耗時的問題,比如,只有做完B才能到C,耗時的話也是20+200ms。
加入消息中間件,改成異步調用後,A可以同時調用B和C,時間也減少了,提高效率。
3、削峰限流
削峰限流主要解決的是高併發的大訪問量場景情況下,在服務前面加一層緩衝,由消息中間件做一層過濾,如果流量太大的話就會被捨棄一部分,其他未被捨棄的部分進入隊列排隊,保護了後端服務的可用性。
差不多,先寫這些吧。
技術大咖秀
消息中間件主要有三個作用:系統間解耦,異步化,流量削峰。我們通過實例來說明。
1 系統間解耦
假設你在一個電商系統購物,支付成功後,系統應該怎麼把這個消息告訴物流系統?有兩種思路:
方式一:支付系統直接調用物流系統。這樣會有一個問題:支付系統和物流系統產生了強依賴,當物流系統出現問題,直接影響用戶交易流程,導致支付失敗。
方式二:支付系統把支付成功消息推送給消息中間件,然後交易流程結束。物流系統訂閱這個消息進行後續處理。這樣即使物流系統出現問題,也不影響交易系統。
2 異步化
假設物流系統處理業務需要100毫秒。
採用方式一:整個鏈路響應時長就增加了100毫秒,耗時增加。
採用方式二:整個鏈路時長就不需要增加這100毫秒,這就是異步化帶來的性能提升。
3 流量削峰
假設雙11商家做秒殺活動,每秒產生了大量訂單數據。
採用方式一:支付系統壓力就會傳遞給物流系統,這是沒有必要的。
採用方式二:物流系統可以根據系統能力,勻速拉取數據處理,削減了流量洪峰。
敬請關注
請點擊關注按鈕【IT徐胖子】會持續為大家奉獻互聯網和技術乾貨內容,感謝支持
IT徐胖子
做分區容錯吧