使用RabbitMQ做的一些工作及經驗教訓


使用RabbitMQ半年有余,每天跑的數據量數億這個量級吧,期間做了些工作,也處理了些問題,稍加總結。

我們使用的場景主要是用於模塊件的數據中轉和分發,客戶端以C++為主,php和python為輔。

工作:

  1. 基於rabbitmq-c開發了c/c++客戶端,主要實現了連接管理、統一配置管理、負載均衡、QPS限制等功能,同時為支持隊列遷移,提供了消息本地緩存功能,通過信號開關;
  2. 為解決特定場景下內存暴漲的問題,額外提供了thrift形式的訪問接口,在thrift層增加了統計、配額管理等功能,同時提供隊列抽象層及多隊列機制,支持后續不中斷服務的擴容;
  3. 開發了配套的工具腳本,一鍵創建vhost\exchange\queue等;
  4. 對隊列所在的服務器,建立了物理資源和應用層面的監控,使用ganglia,應用層面監控了每個隊列的發送速度、消費速度、隊列累計消息;

經驗和教訓:

  1. 提供c++客戶端時,限制使用接口,只保留了publish\consume\ack,保證業務使用時可以有極低的學習成本;
  2. consume時預取參數的大小對consume性能影響很大,具體可參見官方博客
  3. 隊列HA的代價非常高,特別是對帶寬的占用,有限制的使用HA,且只提供兩備份即可;
  4. 磁盤也可能形成瓶頸,如果單台機器隊列很多,確認只在必要時才使用duration,避免把磁盤跑滿;
  5. 隊列的消息大量累積后,發送和消費速度都會受到影響,導致服務進一步惡化,采用的方法是,額外的腳本監控每個隊列的消息數,超過限額會執行purge操作,簡單粗暴但是有效的保證了服務穩定;
  6. 限制單條消息大小,我們的限制是128k,消息隊列只走消息,其他交由存儲去做;
  7. 用iptables適當的限制連接;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM