網(wǎng)易云音樂(lè)消息隊(duì)列改造之路

后臺(tái)技術(shù)也從傳統(tǒng)的 Tomcat 集群到分布式微服務(wù)快速演進(jìn)和迭代,在業(yè)務(wù)的不斷催生下,誕生了云音樂(lè)的 RPC,API 網(wǎng)關(guān)和鏈路跟蹤等多種服務(wù),消息隊(duì)列也從 RabbitMQ 集群遷移到 Kafka 集群。
對(duì)于消息隊(duì)列,更多處于使用階段,也在使用中出現(xiàn)很多問(wèn)題。因此期望提供一種完全可控,出現(xiàn)問(wèn)題自己能排查,能跟蹤,可以根據(jù)業(yè)務(wù)需求做定制改造的消息隊(duì)列。
經(jīng)過(guò) RabbitMQ,Kafka 和 RocketMQ( ActiveMQ 性能較差,暫不考慮)的調(diào)研和分析后,發(fā)現(xiàn) RocketMQ 比較適合云音樂(lè)的通用業(yè)務(wù),但是開(kāi)源 RocketMQ 也有一些缺陷,比如 Broker 僅提供了 Master 到 Slave 的復(fù)制,沒(méi)有 Failover 切換的能力。而且當(dāng)時(shí)事務(wù)消息不開(kāi)源、消息發(fā)送消費(fèi)無(wú)追蹤、沒(méi)有告警與監(jiān)控體系等等,只有解決了這些缺陷才能在業(yè)務(wù)中大規(guī)模使用。
我們期望消息隊(duì)列具備宕機(jī) Failover 能力,根據(jù)不同業(yè)務(wù)場(chǎng)景提供不同 QOS 能力,如商城消息不能丟失、交易事務(wù)消息支持、消息發(fā)送消費(fèi)追蹤、失敗排查等能力。
同時(shí)對(duì)業(yè)務(wù)比較關(guān)心的發(fā)送耗時(shí),消費(fèi)耗時(shí),消費(fèi)延遲,消費(fèi)失敗異常等提供監(jiān)控和告警能力。同時(shí)對(duì)運(yùn)維比較關(guān)心的整體運(yùn)行水位和各項(xiàng)指標(biāo)提供監(jiān)控大盤,以及排查發(fā)現(xiàn)消息隊(duì)列自身問(wèn)題與長(zhǎng)期運(yùn)維能力。
另外云音樂(lè)少部分業(yè)務(wù)是 Nodejs 和 Python 的,提供 HTTP 協(xié)議接入能力。
所以,最終以開(kāi)源 RocketMQ 為內(nèi)核,完全繼承開(kāi)源 RocketMQ 具備的特性。為滿足高可用,增加了 Failover 組件,對(duì) Broker 進(jìn)行健康檢查提供快速切換能力。
對(duì)于業(yè)務(wù)開(kāi)發(fā)關(guān)心的監(jiān)控,修改客戶端,把耗時(shí),異常等數(shù)據(jù)采用系統(tǒng)消息方式上報(bào),由 Monitor 組件消費(fèi)消息并寫入 ES,并提供控制臺(tái)查詢能力。同時(shí)客戶端上報(bào)的數(shù)據(jù),Alarm 也會(huì)消費(fèi)一份,根據(jù)業(yè)務(wù)配置的監(jiān)控項(xiàng)檢查告警,超出閥值直接發(fā)出告警。另外消息系統(tǒng)也會(huì)出現(xiàn)宕機(jī),宕機(jī)選主也有一段時(shí)間(秒級(jí)),雖然客戶端有重試能力,但是有些場(chǎng)景不能很好滿足。因此,消息隊(duì)列提供了降級(jí)組件,在系統(tǒng)異常時(shí),客戶端會(huì)將消息發(fā)送本地或者發(fā)送到容災(zāi)集群,降低系統(tǒng)宕機(jī)時(shí)對(duì)業(yè)務(wù)的影響。
在運(yùn)維方面,提供系統(tǒng)巡檢能力,將系統(tǒng)比較關(guān)鍵的狀態(tài)定時(shí)巡檢,異常則快速發(fā)出告警。我們也提供控制臺(tái)資源管控能力,將 Topic,ProducerGroup,ConsumerGroup,以及上下游應(yīng)用關(guān)聯(lián)并管控起來(lái)。
另外,由于云音樂(lè)根據(jù)自己業(yè)務(wù)的需求,對(duì)開(kāi)源 RocketMQ 的改動(dòng)較多,幾個(gè)特性,如消息軌跡、事務(wù)消息、多環(huán)境隔離。
消息軌跡和開(kāi)源不同的是,云音樂(lè)消息隊(duì)列提供發(fā)送消費(fèi)、事物消息回查軌跡,同時(shí)消費(fèi)失敗時(shí),也在軌跡中提供失敗異常信息,這樣就能夠追蹤失敗原因。
云音樂(lè)在做事務(wù)消息時(shí),開(kāi)源事務(wù)消息還沒(méi)出來(lái)。云音樂(lè)通過(guò)修改存儲(chǔ)引擎實(shí)現(xiàn)自己的事物消息。提供事務(wù)消息回查按時(shí)間收斂能力,回查不到狀態(tài)超過(guò)次數(shù)進(jìn)入死信,同時(shí)提供死信告警,事務(wù)消息回查死信處理能力。
對(duì)于多環(huán)境隔離,云音樂(lè)有很多條業(yè)務(wù)線,每條業(yè)務(wù)線都有很多個(gè)需求在做,同時(shí)各個(gè)業(yè)務(wù)線之間的訪問(wèn)都是通過(guò)服務(wù)化的方式進(jìn)行。為提升開(kāi)發(fā)和測(cè)試效率,通過(guò)對(duì) RPC 流量打標(biāo)的方式將流量隔離到相應(yīng)環(huán)境,并一路透?jìng)飨氯?。消息也一樣,同一個(gè)需求發(fā)送的消息需要相應(yīng)的環(huán)境開(kāi)發(fā)、測(cè)試和其他互不影響。因此云音樂(lè)設(shè)計(jì)實(shí)現(xiàn)了消息隊(duì)列的隔離,加快業(yè)務(wù)開(kāi)發(fā)測(cè)試,預(yù)發(fā)快速驗(yàn)證能力。
