異步不是萬能的,實現異步重要的手段,消息隊列在使用中也是有不少注意事項的。 git
消息隊列至少有三處容易出現瓶頸,咱們一經典的發佈/訂閱模式爲例。分析一下均可能存在哪些瓶頸。 github
發佈 ---> 隊列 ---> 訂閱 json
發佈端問題表如今入隊速度影響了發佈端應用程序的性能,例如 異步
runtime { task1(); task2(); publish(); task3(); task4(); } loop { task1(); task2(); publish(); task3(); task4(); }
上面僞代碼 publish()將阻塞 task3()與task4(),必須等待publish()執行完成才能繼續運行。 oop
這樣的狀況是 發佈數量 > 入隊的速度, 影響發佈端的性能 性能
消息的持久化,既影響入隊速度,也影響出對速度,入隊是寫磁盤操做,出對是修改或者刪除操做。 在隊列同時進行入隊與出隊的操做是,還涉及到各類「鎖」,例如線程鎖與文件鎖等等。 最終結果是消息隊列性能驟降。 網站
訂閱端的處理能力也影響到隊列的堆積程度。若是訂閱端處理速度過慢,咱們就會發現消息在隊列中堆積。 spa
loop { function sub_callback(){ task1(); task2(); task3(); task4(); } }
訂閱端改進,將隊列交給線程處理 線程
threads[max_connet] { function sub_callback(){ task1(); task2(); task3(); task4(); } }
咱們應該儘可能減少消息的體積,例如選擇輕量的協議,超過必定體積作壓縮處理。 code
就消息協議而言, 二進制協議 < 文本協議。而文本協議中 json < xml 等等。
xml 成對出現的閉合標籤佔用了大量的空間,二進制的 msgpack 也好於文本的 json。 選擇使用那種協議還要看你的場景。
另外還須要注意的就是 序列化/反序列化的開銷。
咱們要儘可能作到發佈,隊列與訂閱之間的平衡,才能發揮消息隊列的優點。
做者
陳景峯,暱稱 Netkiller, 英文名 Neo 《Netkiller 系列 手札》電子書的做者,讀者QQ羣:128659835,我的網站:http://netkiller.github.io/
轉載請註明出處與做者聲明