消息隊(duì)列能做什么
1.異步處理??
? ? 用戶使用信用卡支付時(shí)使用同步模式需要串行執(zhí)行所有的服務(wù),響應(yīng)用戶時(shí)間比較長,可以使用消息隊(duì)列異步處理達(dá)到快速響應(yīng)用戶請求捂蕴。
2.流量控制
?在網(wǎng)關(guān)和后端服務(wù)之間使用消息隊(duì)列實(shí)現(xiàn)流量控制,在使用消息隊(duì)列后請求流程變?yōu)椋?/p>
????1.網(wǎng)關(guān)收到請求后把請求放到消息隊(duì)列中。
????2.后端服務(wù)在消息隊(duì)列中獲取app,請求并處理然后返回結(jié)果切黔。
消息超時(shí)可以直接丟棄消息。
這種設(shè)計(jì)的優(yōu)點(diǎn)是:能根據(jù)下游的處理能力自動調(diào)節(jié)流量具篇,達(dá)到“削峰填谷”的作用纬霞。但這樣做同樣是有代價(jià)的:
????1.上下游服務(wù)需要改變?yōu)楫惒浇换シ绞綇?fù)炸度較高。
????2.服務(wù)調(diào)用鏈路變長整體延時(shí)變長驱显。
令牌桶方案:
? ? 在單位時(shí)間生成一定數(shù)量的令牌诗芜,后端服務(wù)處理請求前獲取令牌,如果沒有獲取到令牌則拒絕請求埃疫。這樣就保證了單位時(shí)間內(nèi)單位時(shí)間內(nèi)處理的請求不會超過令牌數(shù)量伏恐,達(dá)到流量控制的效果。
? ? 可以簡單的使用一個(gè)固定容量隊(duì)列加令牌生成器服務(wù)實(shí)現(xiàn)熔恢,令牌生成器勻速生成令牌加入到隊(duì)列中脐湾,如果令牌隊(duì)列滿了就丟棄令牌。網(wǎng)關(guān)調(diào)用后端服務(wù)前叙淌,獲取令牌秤掌,調(diào)用后端服務(wù),如果獲取不到令牌則直接返回失敗鹰霍。
3.服務(wù)解耦
? ? 如電商的訂單系統(tǒng)闻鉴,很多下游服務(wù)需要實(shí)時(shí)訂單信息,這些下游系統(tǒng)隨著需求的變化不斷的新增變化茂洒,每新增或變化需要修改訂單系統(tǒng)孟岛,對核心訂單系統(tǒng)來說是不可接受的。所以我們可以把訂單系統(tǒng)生成的訂單放入消息隊(duì)列,下游系統(tǒng)需要訂單數(shù)據(jù)可以訂閱消息隊(duì)列渠羞,實(shí)現(xiàn)服務(wù)間解耦斤贰。
以上就是消息隊(duì)列經(jīng)常使用的三個(gè)場景,當(dāng)然還有其他的使用場景次询。
? ? 1.作為發(fā)布 / 訂閱系統(tǒng)實(shí)現(xiàn)一個(gè)微服務(wù)級系統(tǒng)間的觀察者模式荧恍。
? ? 2.連接流計(jì)算任務(wù)和數(shù)據(jù)。
? ? 3.用于將消息廣播給大量接收者屯吊。?
等等其他一些場景送巡。
使用消息隊(duì)列也帶來了一些其他問題:
? ? 1.使用消息隊(duì)列帶來的延時(shí)問題
? ? 2.增加了系統(tǒng)復(fù)炸性
? ? 3.數(shù)據(jù)的一致性