forked from CyC2018/CS-Notes
-
Notifications
You must be signed in to change notification settings - Fork 3
/
消息隊列.md
90 lines (50 loc) · 4.76 KB
/
消息隊列.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!-- GFM-TOC -->
* [一、消息模型](#一消息模型)
* [點對點](#點對點)
* [發佈/訂閱](#發佈訂閱)
* [二、使用場景](#二使用場景)
* [異步處理](#異步處理)
* [流量削鋒](#流量削鋒)
* [應用解耦](#應用解耦)
* [三、可靠性](#三可靠性)
* [發送端的可靠性](#發送端的可靠性)
* [接收端的可靠性](#接收端的可靠性)
* [參考資料](#參考資料)
<!-- GFM-TOC -->
# 一、消息模型
## 點對點
消息生產者向消息隊列中發送了一個消息之後,只能被一個消費者消費一次。
<div align="center"> <img src="pics/206f965e-53b2-4732-90cf-75910b80d7ac.png" width="450px"/> </div><br>
## 發佈/訂閱
消息生產者向頻道發送一個消息之後,多個消費者可以從該頻道訂閱到這條消息並消費。
<div align="center"> <img src="pics/4e93f7d4-2623-4129-a939-59051256561e.png" width="450px"/> </div><br>
發佈與訂閱模式和觀察者模式有以下不同:
- 觀察者模式中,觀察者和主題都知道對方的存在;而在發佈與訂閱模式中,生產者與消費者不知道對方的存在,它們之間通過頻道進行通信。
- 觀察者模式是同步的,當事件觸發時,主題會調用觀察者的方法,然後等待方法返回;而發佈與訂閱模式是異步的,生產者向頻道發送一個消息之後,就不需要關心消費者何時去訂閱這個消息,可以立即返回。
<div align="center"> <img src="pics/530764d5-f67f-47a2-8df4-57e8646e1400.png" width="450px"/> </div><br>
# 二、使用場景
## 異步處理
發送者將消息發送給消息隊列之後,不需要同步等待消息接收者處理完畢,而是立即返回進行其它操作。消息接收者從消息隊列中訂閱消息之後異步處理。
例如在註冊流程中通常需要發送驗證郵件來確保註冊用戶身份的合法性,可以使用消息隊列使發送驗證郵件的操作異步處理,用戶在填寫完註冊信息之後就可以完成註冊,而將發送驗證郵件這一消息發送到消息隊列中。
只有在業務流程允許異步處理的情況下才能這麼做,例如上面的註冊流程中,如果要求用戶對驗證郵件進行點擊之後才能完成註冊的話,就不能再使用消息隊列。
## 流量削鋒
在高併發的場景下,如果短時間有大量的請求到達會壓垮服務器。
可以將請求發送到消息隊列中,服務器按照其處理能力從消息隊列中訂閱消息進行處理。
## 應用解耦
如果模塊之間不直接進行調用,模塊之間耦合度就會很低,那麼修改一個模塊或者新增一個模塊對其它模塊的影響會很小,從而實現可擴展性。
通過使用消息隊列,一個模塊只需要向消息隊列中發送消息,其它模塊可以選擇性地從消息隊列中訂閱消息從而完成調用。
# 三、可靠性
## 發送端的可靠性
發送端完成操作後一定能將消息成功發送到消息隊列中。
實現方法:在本地數據庫建一張消息表,將消息數據與業務數據保存在同一數據庫實例裡,這樣就可以利用本地數據庫的事務機制。事務提交成功後,將消息表中的消息轉移到消息隊列中,若轉移消息成功則刪除消息表中的數據,否則繼續重傳。
## 接收端的可靠性
接收端能夠從消息隊列成功消費一次消息。
兩種實現方法:
- 保證接收端處理消息的業務邏輯具有冪等性:只要具有冪等性,那麼消費多少次消息,最後處理的結果都是一樣的。
- 保證消息具有唯一編號,並使用一張日誌表來記錄已經消費的消息編號。
# 參考資料
- [Observer vs Pub-Sub](http://developers-club.com/posts/270339/)
- [消息隊列中點對點與發佈訂閱區別](https://blog.csdn.net/lizhitao/article/details/47723105)
# 微信公眾號
更多精彩內容將發佈在微信公眾號 CyC2018 上,你也可以在公眾號後臺和我交流學習和求職相關的問題。另外,公眾號提供了該項目的 PDF 等離線閱讀版本,後臺回覆 "下載" 即可領取。公眾號也提供了一份技術面試複習大綱,不僅系統整理了面試知識點,而且標註了各個知識點的重要程度,從而幫你理清多而雜的面試知識點,後臺回覆 "大綱" 即可領取。我基本是按照這個大綱來進行復習的,對我拿到了 BAT 頭條等 Offer 起到很大的幫助。你們完全可以和我一樣根據大綱上列的知識點來進行復習,就不用看很多不重要的內容,也可以知道哪些內容很重要從而多安排一些複習時間。
<br><div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/other/公眾號海報6.png"></img></div>