MQ全稱為Message Queue,消息隊列是應用程序和應用程序之間的通信方法。
-
為什么使用MQ
在項目中,可將一些無需即時返回且耗時的操作提取出來,進行異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。
-
開發中消息隊列通常有如下應用場景:
1、任務異步處理
將不需要同步處理的並且耗時長的操作由消息隊列通知消息接收方進行異步處理。提高了應用程序的響應時間。
2、應用程序解耦合
MQ相當於一個中介,生產方通過MQ與消費方交互,它將應用程序進行解耦合。
3、削峰填谷
如訂單系統,在下單的時候就會往數據庫寫數據。但是數據庫只能支撐每秒1000左右的並發寫入,並發量再高就容易宕機。低峰期的時候並發也就100多個,但是在高峰期時候,並發量會突然激增到5000以上,這個時候數據庫肯定卡死了。

消息被MQ保存起來了,然后系統就可以按照自己的消費能力來消費,比如每秒1000個數據,這樣慢慢寫入數據庫,這樣就不會卡死數據庫了。

但是使用了MQ之后,限制消費消息的速度為1000,但是這樣一來,高峰期產生的數據勢必會被積壓在MQ中,高峰就被“削”掉了。但是因為消息積壓,在高峰期過后的一段時間內,消費消息的速度還是會維持在1000QPS,直到消費完積壓的消息,這就叫做“填谷”

JMS
JMS即Java消息服務(JavaMessage Service)應用程序接口,是一個Java平台中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。
-
JMS是定義了統一的接口,來對消息操作進行統一;AMQP是通過規定協議來統一數據交互的格式
-
JMS限定了必須使用Java語言;AMQP只是協議,不規定實現方式,因此是跨語言的。
-
JMS規定了兩種消息模式;而AMQP的消息模式更加豐富
市場上常見的消息隊列有如下:
-
ActiveMQ:基於JMS
-
ZeroMQ:基於C語言開發
-
RabbitMQ:基於AMQP協議,erlang語言開發,穩定性好
-
RocketMQ:基於JMS,阿里巴巴產品
-
Kafka:類似MQ的產品;分布式消息系統,高吞吐量
RabbitMQ是由erlang語言開發,基於AMQP(Advanced Message Queue 高級消息隊列協議)協議實現的消息隊列,它是一種應用程序之間的通信方法,消息隊列在分布式系統開發中應用非常廣泛。
RabbitMQ官方地址:http://www.rabbitmq.com/
RabbitMQ提供了6種模式:簡單模式,work模式,Publish/Subscribe發布與訂閱模式,Routing路由模式,Topics主題模式,RPC遠程調用模式(遠程調用,不太算MQ;暫不作介紹);
官網對應模式介紹:https://www.rabbitmq.com/getstarted.html

