【轉載】做者:曾健生,公衆號ID:appbackendphp
比目科技 Bmob後端雲java
不少沒有實際項目經驗的小夥伴,對消息隊列系統很是陌生,看着不少架構的介紹中,都提到消息隊列。可是,不知道爲何要用消息隊列?什麼是消息隊列?常見的消息隊列產品有哪些?web
經過閱讀本文,幫你解開以上的疑惑。redis
1.爲何要用消息隊列?後端
假設一個老大,接到一個任務要處理完。在處理這個任務時,把這個任務分解爲幾個小任務,只要分別完成了這幾個小任務,整個任務也就完成了。數據結構
作到某個小任務時,發現這個小任務須要花不少時間完成,並且這個小任務遲點完成也不影響整個任務的完成進度。因而,老大把這個小任務交個一個小弟去作,本身去接着完成其餘的任務。架構
在上面的例子中,老大就是後臺系統,小弟就是消息隊列系統,當後臺系統發現完成某些小任務須要花不少時間,並且遲點完成也不影響整個任務的,就會把這些小任務交給消息隊列系統。app
在實際的app後端中,發送郵件,發送短信,推送等這些任務,都很是適合在消息隊列系統中作的。你們想一想,這些任務是否是都須要花比較多的時間,並且遲點完成也不影響的。把這些任務放在隊列中,可加快請求的響應時間。負載均衡
2.消息隊列是怎麼工做?運維
消息隊列系統,通常都包含3個角色:隊列服務端,隊列的生產者,隊列的消費者。
消息隊列系統相似於這個場景:有一條信息傳送帶不停地運轉。在傳送帶的起點,工人a不斷地把信息放在一個盒子,把盒子放到傳送帶上,盒子被傳送帶傳送到終點。在終點上,工人b把盒子上的信息取出來,進行處理。
在上面的場景中,不停運轉的傳送帶就是隊列服務端,在傳送帶起點不斷放盒子的工人a就是隊列的生產者,在傳送帶終點不斷取盒子的工人b就是隊列的消費者。
消息隊列的服務端,如今有大量的開源的應用,例如RabbitMQ ,ZeroMQ ,redis等。
隊列的生產者和服務者,是針對消息隊列服務端開發的客戶端,例如,RabbitMQ就有針對java,php等語言開發的客戶端。
例如,在app後端中,用代碼調用 java客戶端,把要發送的短信信息放在ZeroMQ中,這裏java客戶端是充當隊列的生產者。
寫一個守護進程,在守護進程中,經過代碼調用 java客戶端把要發送的短信信息不斷地從ZeroMQ取出來,而後發送出去。
3.常見的一些消息隊列產品
RabbitMQ:
是使用Erlang編寫的一個開源的消息隊列,自己支持不少的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的很是重量級,更適合於企業級的開發。同時實現了一個經紀人(Broker)構架,這意味着消息在發送給客戶端時先在中心隊列排隊。對路由(Routing),負載均衡(Load balance)或者數據持久化都有很好的支持。
同時,RabbitMQ自帶了一個web監控界面,可方便監控隊列的狀況。
Redis:
雖然是一個key-value系統,但自身也支持隊列這種數據結構,可看作是一個輕量級的消息隊列系統。
在app後端架構中,redis是被普遍使用,若是同時把它做爲消息隊列使用,就減小了運維上的成本。
ZeroMq:
號稱最快的消息隊列系統,尤爲針對大吞吐量的需求場景。
ActiveMQ:
是Apache下的一個子項目。 相似於ZeroMQ,它可以以代理人和點對點的技術實現隊列。