淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

本文主要講解RabbitMQ的應用場景、具體實現。

1.應用場景

目前常見的應用軟件都有消息的延遲推送的影子,應用也極為廣泛,例如:

  • 淘寶七天自動確認收貨。在我們簽收商品後,物流系統會在七天後延時發送一個消息給支付系統,通知支付系統將款打給商家,這個過程持續七天,就是使用了消息中間件的延遲推送功能。
  • 12306 購票支付確認頁面。我們在選好票點擊確定跳轉的頁面中往往都會有倒計時,代表著 30 分鐘內訂單不確認的話將會自動取消訂單。其實在下訂單那一刻開始購票業務系統就會發送一個延時消息給訂單系統,延時30分鐘,告訴訂單系統訂單未完成,如果我們在30分鐘內完成了訂單,則可以通過邏輯代碼判斷來忽略掉收到的消息。

在上面兩種場景中,如果我們使用下面兩種傳統解決方案無疑大大降低了系統的整體性能和吞吐量:

  • 使用 redis 給訂單設置過期時間,最後通過判斷 redis 中是否還有該訂單來決定訂單是否已經完成。這種解決方案相較於消息的延遲推送性能較低,因為我們知道 redis 都是存儲於內存中,我們遇到惡意下單或者刷單的將會給內存帶來巨大壓力。
  • 使用傳統的數據庫輪詢來判斷數據庫表中訂單的狀態,這無疑增加了IO次數,性能極低。
  • 使用 jvm 原生的 DelayQueue ,也是大量佔用內存,而且沒有持久化策略,系統宕機或者重啟都會丟失訂單信息。

2.消息延遲推送的實現

在 RabbitMQ 3.6.x 開始,RabbitMQ 官方提供了延遲隊列的插件,可以下載放置到 RabbitMQ 根目錄下的 plugins 下,延遲隊列插件下載:https://www.rabbitmq.com/community-plugins.html

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

下載延遲隊列插件

然後開啟rabbitmq_delayed_message_exchange插件

<code>rabbitmq-plugins enable rabbitmq_delayed_message_exchange/<code>
淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

開啟rabbitmq_delayed_message_exchange插件

通過命令:

<code>rabbitmq-plugins list/<code>

可以查看插件的列表:

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

查看插件的列表

3.生產端

目錄結構

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

生產端 目錄結構

application.yml 配置

<code>spring:
rabbitmq:
port: 5672
host: localhost
username: guest
password: guest
virtual-host: /
connection-timeout: 15000
#開啟 confirm 確認機制
publisher-confirms: true
#開啟 return 確認機制
publisher-returns: true
template:
mandatory: true

server:
port: 8080/<code>

4.消費端

在實際生產環境中,生產端和消費端一般都是兩個系統,我們在此也將拆分成兩個項目。

目錄結構

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

application.yml 配置

<code>spring:
rabbitmq:
port: 5672
host: localhost
username: guest
password: guest
virtual-host: /
#設置消費端手動 ack
listener:
simple:
acknowledge-mode: manual
#消費者最小數量
concurrency: 1
#消費之最大數量
max-concurrency: 10
#在單個請求中處理的消息個數,他應該大於等於事務數量(unack的最大數量)
prefetch: 2

server:
port: 8081/<code>

5.運行效果

5.1運行消費端

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

5.2運行生產端

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

5.3查看消費端

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?


淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

由於我延時時間設置的為6秒鐘,所以6秒後消費端收到消息。

6.獲取代碼

淘寶自動確認收貨怎麼使用Springboot+RabbitMQ實現?

關注公眾號:理木客 ,後臺回覆:mq111 ,即可獲取兩個項目的完整代碼。


分享到:


相關文章: