rabbitmq 入門到熟悉|不敢說精通

rabbitmq 可以使用的場景

  • 異步接口調用

有這樣的一種場景,公司項目原本是經過 http 接口來調用第三方接口,可是這樣帶來了不少問題;我在實際項目中有碰到這樣一種狀況,因爲對方服務不穩定,接口雖然調過去了,對方操做成功,可是因爲網絡緣由或其它緣由,未能返回成功的反饋,致使我方業務出錯,這在量少的時候還能夠經過人工處理解決,當量上來的時候,就是一場災難。html

  • 流量削鋒
  • 日誌處理

與 kafka 的優缺點

kafka 來講的話是高吞吐量,kafka 在每秒百萬級別(通常用在設備上點等高頻數據操做),徹底分佈式; 而 rabbitmq 比較簡單,遵循 amqp 協議,通常應用可使用;不適合物聯網數據上報java

各組件說明

  • ConnectionFactory 鏈接工廠,用於設置鏈接相關信息,建立鏈接
  • Channel 信道,全部的發送消息,建立隊列,建立交換機,接收消息都是經過它
  • Exchange 消息交換機,至關於 DispatchServlet
  • Queue 隊列,存放消息的地方,只有這裏能夠存放消息
  • RoutingKey 路由鍵,設置消息路由,派發給哪一個隊列
  • BindingKey 綁定鍵,用於把隊列綁定到交換機上,只有隊列綁定到交換機上,消息才能夠路由給隊列

注意事項spring

  • 隊列一經建立就不能夠更改參數
  • 消息能夠直接發到隊列上,也能夠由交換機轉發

rabbitmq 的幾種模式

這裏我是學的這個視頻 ,正好又找到對應的代碼博客 視頻地址數據庫

簡單隊列


解讀:springboot

  • 一個生產者
  • 一個消費者
  • 一個隊列

代碼: 簡單隊列網絡

Work模式


解讀:ssh

  • 一個隊列
  • 兩個消費者同時消費

代碼(輪詢分發): 輪詢分發
代碼(公平分發): 也叫能者多勞 公平分發異步

訂閱模式


解讀:分佈式

  • 一個隊列對應一個消費者
  • 多個隊列,多個消費者
  • 消息是發到交換機上的
  • 消息是每一個隊列都轉發所有消息

代碼: 訂閱模式ide

路由模式


解讀:

  • 消息再也不是所有轉發,而是根據路由鍵來轉發,作的全名稱匹配
  • 隊列能夠和交換機綁定多個路由鍵

代碼: 路由模式

主題模式


解讀:

  • 這個可能和你本來理解的 kafka 的主題模式有區別 ,kafka 的主題模式應該是對應發佈訂閱模式
  • 這個相比較於路由模式來講是把全名稱匹配換成了模式匹配,有了通配符

    • # 匹配全部
    • * 匹配一個 ~感受有點反人類~

代碼: 主題模式

如何保證消息的可靠性

生產端有兩種方式來確保消息到達隊列

  1. 事務機制(不建議,性能過低)

代碼:事務機制

  1. confirm 機制

代碼:confirm同步模式confirm異步處理模式

消費者端有 ack 確認來確保可靠

//將自動 ack 確認設置爲 false ,而後手動來確認已經收到消息並正確處理業務 
boolean autoAck=false;
channel.basicConsume("test",autoAck,defaultConsumer);

//迴應 rabbitmq 已經收到消息並處理
channel.basicAck(envelope.getDeliveryTag(),false);

上面的代碼雖然能解決消息丟失的問題,但有一個弊端,就是當業務處理時間特別長的時候,rabbitmq 得不到迴應,形成消息堆積。解決辦法以下。

  1. 仍是使用手動 ack
  2. 收到消息後,先把消息存入 rabbitmq 的一個未處理隊列中
  3. 而後回執 ack
  4. 執行業務,業務處理完成後,發送二次確認到 rabbit 未處理隊列,消費掉未處理的消息

rabbitmq 自己能夠作持久化來保證可靠性

// 設置方法在聲明隊列的第二個參數,是否持久化,設置爲 true 便可
boolean durable = true;
channel.queueDeclare(QUEUE_NAME,durable,false,false,null);

死信隊列和使用場景

什麼是死信隊列

  1. 一個消息被Consumer拒收了,而且reject方法的參數裏requeue是false。也就是說不會被再次放在隊列裏,被其餘消費者使用。
  2. 上面的消息的TTL到了,消息過時了。
  3. 隊列的長度限制滿了。排在前面的消息會被丟棄或者扔到死信路由上。

使用場景

  • 12306 的那種訂單 30 分鐘後超時,數據庫中會一個訂單狀態,在 30 分鐘後須要更新爲已超時,使用傳統方法時要麼使用定時任務掃描訂單,要麼是保存一個 map 到內存,操做都很繁瑣,這時候可使用死信隊列,設置隊列消息的超時時間爲 30 分鐘,而後把消息經過死信交換機發送到特定隊列中去,再有專門的程序更新單條記錄爲訂單超時到數據庫中。
  • 物聯網系統常常會遇到向終端下發命令,若是命令一段時間沒有應答,就須要設置成超時,而後監聽到命令超時再反饋給物聯網系統。

使用 springboot 來調用 rabbitmq

一些小推廣

Excel 通用導入導出,支持 Excel 公式
https://blog.csdn.net/sanri1993/article/details/100601578

使用模板代碼 ,從數據庫生成代碼 ,及一些項目中常常能夠用到的小工具
https://blog.csdn.net/sanri1993/article/details/98664034

感謝原做者,文章引用

原做者的文章恰好能和視頻對上,太感謝了,我只是幫原做者作了個文章排序而已;
引用你的文章但願不介意

https://blog.csdn.net/qq78442761/article/category/9040352
https://www.cnblogs.com/ssh-html/p/10542841.html

相關文章
相關標籤/搜索