1. 程式人生 > >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適當的限制連線;