喜马拉雅 Apache RocketMQ 消息治理实践
簡介:本文通過喜馬拉雅的RocketMQ治理實踐分享,讓大家了解使用消息中間件過程中可能遇到的問題,避免實戰中踩坑。
作者:曹融,來自喜馬拉雅,從事微服務和消息相關中間件開發。
本文通過喜馬拉雅的RocketMQ治理實踐分享,讓大家了解使用消息中間件過程中可能遇到的問題,避免實戰中踩坑。
業務背景現狀以及遇到的問題
1、消息隊列概況
(1)在線場景:RabbitMQ,實例數9個;
(2)離線場景:Kafka,8個集群;
2、遇到的問題
在線場景缺乏治理:
? 業務混用,相互干擾,非核心對接積壓過多觸發集群限流;
? 節點負載不均衡,資源浪費嚴重;
? 資源和應用無關聯,消息積壓;
? 業務混用,相互干擾,非核心對接積壓過多觸發集群限流;
在線MQ集群改造方案
1、選型
(1)業務便捷性:易于開發、使用、維護,提高效率,如自帶重試、自帶死信、自帶事務保障;
(2)性能:包容業務的不確定性,如抗短時突發流量、抗積壓等;
(3)簡單:架構適用于拆分小集群;Java語言易于排查問題和二次開發;社區活躍,使用的人多,方便排查問題;
2、治理方案
(1)集群劃分方針:劃分小集群,減少相互干擾,減少影響面;
(2)拆分方案:
如上圖所示,對于公司和“錢”相關的業務及核心業務,不僅要給足資源,同時要保證較高的數據安全,在這里就使用了SYNC_MASTER;
- 對于非核心業務,我們希望它的性價比高,使用盡量少的資源去支撐足夠多的數據量,此處就使用了ASYNC_MASTER,伸縮性會更好;
- 對于其它數據安全要求不高的業務,包括消息軌跡,我們使用單MASTER集群,保證了性能需要,資源使用也少;
- 對于延時集群,專注于積壓消息,pagecache利用率低,目前還沒用做,未來考慮在云上采用按需購買的方式來使用;另外對于臨時集群目前也沒有涉及。
3、控制面管理
(1)統一消息治理后臺;
對所有消息中間件的后臺做了一個統一的管理后臺,如上圖。
(2)對RabbitMQ,僅維護,自動維護關聯關系;
(3)對于RocketMQ,用于提升用戶體驗,比如發送/查詢消息、一鍵接入demo、死信重發等;
消息管理界面
配置demo
死信重發
(4)PaaS化審批
我們對消息化的資源管理做了一個PaaS化的管理,對功能做了一些限制,開發和運維只能在測試環境下做申請和審批,審批通過后再同步到其它環境,然后創建資源、通知用戶。
4、統一接入SDK
(1)用戶只關心用什么資源,不需要了解namesrv地址,減少出錯概率;
(2)動態配置熱生效,節約用戶時間;
(3)收/發消息,失敗重試,為中間件做兜底;
(4)熔斷限流,為業務做兜底;
(5)灰度收消息(消息開關),滿足業務特殊場景;
(6)集成公司其他功能,如調用鏈、全鏈路壓測等;
5、多維度監控
- 運維:整體情況,cluster 內 top 情況,所屬物理機情況;
- 資源:Topic 上下游 qps,lag 等;
- 用戶:實例消息收發均勻,延遲。
老集群遷移方案
1、人工遷移
場景:消息上下游均為自己的服務;
遷移流程:雙收(RocketMQ&RabbitMQ)-> 雙發-> 單發(RocketMQ)-> 單收;
需要注意的問題:業務重構,topic合并可能導致下游多tag消息傾斜,導致lag異常問題;
2、自動遷移
- RabbitMQ <--> RocketMQ 相互鏡像遷移;
- 粒度: exchange < -- > topic;
- 注意: 相同組的任務互斥;
(1)RabbitMQ -> RocketMQ的遷移方案:
- 把RabbitMQ的exchange整體同步到topic,在abc.exchange加一個topic前綴為topic_abc.excange;
- 把RabbitMQ的Routing key預設為RocketMQ的tag;
- 通過migrator任務程序收集RabbitMQ的消息隊列,按照不同的類型傳遞到RocketMQ;
(2)RocketMQ -> RabbitMQ的遷移方案:
方法類似,見下圖:
(3)自動遷移的幾種情況:
- 消費者遷移,生產者不動:
配置RabbitMQ -> RocketMQ 任務; - 生產者遷移,消費者不動:
配置RocketMQ -> RabbitMQ 任務; - 生產者先不遷移,然后遷移了:
先配置RabbitMQ -> RocketMQ 任務;
遷移完畢后,關閉RabbitMQ -> RocketMQ 任務;
? ? 配置RocketMQ -> RabbitMQ 任務。
原文鏈接
本文為阿里云原創內容,未經允許不得轉載。?
總結
以上是生活随笔為你收集整理的喜马拉雅 Apache RocketMQ 消息治理实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv实现几幅图像拼接成一整幅大图
- 下一篇: 各位 PHPer,Serverless