1. 程式人生 > >Java高並發--消息隊列

Java高並發--消息隊列

原因 直接 最終一致性 並發 流程 彌補 如何解決 購物 分享

Java高並發--消息隊列

舉個例子:在購物商城下單後,希望購買者能收到短信或者郵件通知。有一種做法時在下單邏輯執行後調用短信發送的API,如果此時服務器響應較慢、短信客戶端出現問題等諸多原因購買者不能正常收到短信,那麽此時是不斷重試呢還是直接放棄發送呢?不管選擇哪一種,在實現上都會變得復雜。

消息隊列是如何解決的呢?可以講發送短信這個過程封裝成一條消息,發送到消息隊列,消息隊列按照一定順序依次處理隊列中的消息,在某一個時刻就會處理剛才收到的發送短信的消息。消息隊列會通知一個服務去發送這個短信,順利的話這個消息剛被放進隊列就會被處理,這種情況一次性就發送成功了。如果出現了什麽問題,可以再次將該消息放進消息隊列中等待處理。

技術分享圖片

上面的例子中如果使用消息隊列,其好處是將發送短信這個流程與其他功能解耦,發送短信時只需要保證將這條消息發送到消息隊列就行了,然後就可以處理發送短信後的其他事情了;其次,系統設計變得簡單,不用在下單的場景下過多的考慮發送短信的問題,而是交給了消息隊列來處理這個事。而且可以保證消息一定會被發送出去,消息只要沒有發送成功會不斷被重新加入到消息隊列。如果短信服務出現問題,那麽等到服務恢復了,消息隊列再發送出去即可,只是發送的不那麽及時而已。

消息隊列的特性

  • 和業務無關:只負責消息分發

  • FIFO:先投遞先到達
  • 容災:得益於節點的動態增刪和消息的持久化
  • 性能:吞吐量提升,系統內部通信效率提高

什麽時候需要消息隊列呢?當生產和消費的速度和穩定性等因素不一致時,消息隊列可以彌補雙方的差異。

消息隊列的好處:

  • 業務解耦
  • 最終一致性(兩個系統的狀態保持一致,要麽都成功要麽都失敗)
  • 廣播
  • 錯峰與流控

Java高並發--消息隊列