Java高並發--消息隊列
阿新 • • 發佈:2019-04-20
原因 直接 最終一致性 並發 流程 彌補 如何解決 購物 分享
Java高並發--消息隊列
舉個例子:在購物商城下單後,希望購買者能收到短信或者郵件通知。有一種做法時在下單邏輯執行後調用短信發送的API,如果此時服務器響應較慢、短信客戶端出現問題等諸多原因購買者不能正常收到短信,那麽此時是不斷重試呢還是直接放棄發送呢?不管選擇哪一種,在實現上都會變得復雜。
消息隊列是如何解決的呢?可以講發送短信這個過程封裝成一條消息,發送到消息隊列,消息隊列按照一定順序依次處理隊列中的消息,在某一個時刻就會處理剛才收到的發送短信的消息。消息隊列會通知一個服務去發送這個短信,順利的話這個消息剛被放進隊列就會被處理,這種情況一次性就發送成功了。如果出現了什麽問題,可以再次將該消息放進消息隊列中等待處理。
上面的例子中如果使用消息隊列,其好處是將發送短信這個流程與其他功能解耦,發送短信時只需要保證將這條消息發送到消息隊列就行了,然後就可以處理發送短信後的其他事情了;其次,系統設計變得簡單,不用在下單的場景下過多的考慮發送短信的問題,而是交給了消息隊列來處理這個事。而且可以保證消息一定會被發送出去,消息只要沒有發送成功會不斷被重新加入到消息隊列。如果短信服務出現問題,那麽等到服務恢復了,消息隊列再發送出去即可,只是發送的不那麽及時而已。
消息隊列的特性
和業務無關:只負責消息分發
- FIFO:先投遞先到達
- 容災:得益於節點的動態增刪和消息的持久化
性能:吞吐量提升,系統內部通信效率提高
什麽時候需要消息隊列呢?當生產和消費的速度和穩定性等因素不一致時,消息隊列可以彌補雙方的差異。
消息隊列的好處:
- 業務解耦
- 最終一致性(兩個系統的狀態保持一致,要麽都成功要麽都失敗)
- 廣播
- 錯峰與流控
Java高並發--消息隊列