1、什么是rabbitmq
采用AMQP高級消息隊列協(xié)議的一種消息隊列技術(shù),最大的特點就是消費并不需要確保提供方存在,實現(xiàn)了服務之間的高度解耦
2、為什么要使用rabbitmq
1. 在分布式系統(tǒng)下具備異步,削峰,負載均衡等一系列高級功能;
2. 擁有持久化的機制,進程消息,隊列中的信息也可以保存下來。
3. 實現(xiàn)消費者和生產(chǎn)者之間的解耦。
4. 對于高并發(fā)場景下,利用消息隊列可以使得同步訪問變?yōu)榇性L問達到一定量的限流,利于數(shù)據(jù)庫的操作。
可以使用消息隊列達到異步下單的效果,排隊中,后臺進行邏輯下單
3、使用rabbitmq的場景
1. 服務間異步通信
2. 順序消費
3. 定時任務
4. 請求削峰
4、如何確保消息正確地發(fā)送至RabbitMQ? 如何確保消息接收方消費了消息?
發(fā)送方確認模式
將信道設置成confirm模式(發(fā)送方確認模式),則所有在信道上發(fā)布的消息都會被指派一個唯一的ID。
一旦消息被投遞到目的隊列后,或者消息被寫入磁盤后(可持久化的消息),信道會發(fā)送一個確認給生產(chǎn)者(包含消息唯一ID)。
如果RabbitMQ發(fā)生內(nèi)部錯誤從而導致消息丟失,會發(fā)送一條nack(not acknowledged,未確認)消息。
發(fā)送方確認模式是異步的,生產(chǎn)者應用程序在等待確認的同時,可以繼續(xù)發(fā)送消息。當確認消息到達生產(chǎn)者應用程序,生產(chǎn)者應用程序的回調(diào)方法就會被觸發(fā)來處理確認消息。
接收方確認機制
接收方消息確認機制
消費者接收每一條消息后都必須進行確認(消息接收和消息確認是兩個不同操作)。只有消費者確認了消息,RabbitMQ才能安全地把消息從隊列中刪除。
這里并沒有用到超時機制,RabbitMQ僅通過Consumer的連接中斷來確認是否需要重新發(fā)送消息。也就是說,只要連接不中斷,RabbitMQ給了Consumer足夠長的時間來處理消息。保證數(shù)據(jù)的最終一致性;
下面羅列幾種特殊情況
如果消費者接收到消息,在確認之前斷開了連接或取消訂閱,RabbitMQ會認為消息沒有被分發(fā),然后重新分發(fā)給下一個訂閱的消費者。(可能存在消息重復消費的隱患,需要去重)
如果消費者接收到消息卻沒有確認消息,連接也未斷開,則RabbitMQ認為該消費者繁忙,將不會給該消費者分發(fā)