rabbitmq---順序消息幾點思考

rabbitMq要想實現順序消息,哪就要保證一個任務隊列只有一個消費者,曾經這句話給我帶來了不少困惑?

  1. 順序消費,只有一個隊列,一個消費者,這樣吞吐量就會下降,怎麼優化?

多數業務場景下,可以做局部順序,創建多個隊列,同一業務id的消息發送到同一個消息隊列,這樣隊列數增加,消費者數量也會增加 了

  1. 生產者消息入隊亂序怎麼辦?

亂序舉例: 如正常生產者消息入隊後順序應該爲 m3 m2 m1, 但由於生產者端亂序,隊列裏的順序是 m3 m1 m2; 其實這個問題已經有點偏離順序消息這個問題了,這是業務順序的處理範疇;但是我們仍然可以用一些方法處理掉
方案一:
a. 首先生產者要保證消息發送,要保證3個消息都在隊列裏;
b. 當消費者根據業務檢測到消息亂序時,如先收到m2哪就將m2重新入隊,消息順序變爲: m2 m3 m1; 接下來消費m1, 消費到m3 時又發現亂序, 將m3重新入隊,消息順序變爲m3 m2, 其中m1 已經被消費了,那麼就可以保證最終被消費的順序爲m1 m2 m3 和業務想要達到的效果是一致的
方案二:
消費者檢測到消息業務亂序時,通過延遲隊列來解決:將消息設置超時時間,先放到超時隊列; 超時後放到死信隊列中。 通過延遲隊列,對消息進行業務層的排序

  1. 現在應用都是集羣部署,想要整個集羣只有一個消費者,怎麼實現?

可以通過分佈式鎖來實現, 保證只有獲取到分佈式鎖(可以zookeeper 或redis實現)的應用實例,纔可以創建消費者

  1. 集羣中只有一個消費者,怎麼保證高可用呢

方向應該很明確,就是監控消費者應用實例
a. 可以通過運維的監控手段,監控每臺機器實例,及時發現 ,重啓唄
b. 或者集羣中的其他應用實例,定時去獲取上一步的鎖,當消費者實例掛了的時候鎖也應該釋放,集羣中的其他實例去創建消費者,就實現了消費者高可用

  1. 爲了順序消息,我們做了多個隊列,哪就會對應多個消費者,怎麼實現消費者負載均衡呢

思路:
要做負載均衡,就要知道集羣有多少個應用實例,本應用實例中啓動了多少消費者; 假如集羣有3個應用實例,15個隊列15個消費者; 哪正常應該每個實例5個消費者,但兼顧高可用,每個實例允許的消費者數量應該大於5。。。。。。兼顧高可用和負載還要做更多的考慮

這是我對順序消息的思考,如果有不對的,或者大家有什麼好的想法,歡迎下方評論交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章