消息队列.md 3.5 KB
Newer Older
C
CyC2018 已提交
1 2 3
# 一、消息模型

## 点对点
C
CyC2018 已提交
4 5 6

消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。

C
CyC2018 已提交
7
<img src="index_files/685a692f-8f76-4cac-baac-b68e2df9a30f.jpg" width="400px"/>
C
CyC2018 已提交
8

C
CyC2018 已提交
9
## 发布/订阅
C
CyC2018 已提交
10 11 12

消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。

C
CyC2018 已提交
13
<img src="index_files/ddb5ff4c-4ada-46aa-9bf1-140bdb5e4676.jpg" width="400PX"/>
C
CyC2018 已提交
14 15 16

发布与订阅模式和观察者模式有以下不同:

C
CyC2018 已提交
17 18
- 观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,发布者与订阅者不知道对方的存在,它们之间通过频道进行通信。
- 观察者模式是同步的,当事件触发时,主题会调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,发布者向频道发送一个消息之后,就不需要关心订阅者何时去订阅这个消息,可以立即返回。
C
CyC2018 已提交
19

C
CyC2018 已提交
20
<img src="index_files/bee1ff1d-c80f-4b3c-b58c-7073a8896ab2.jpg" width="400PX"/>
C
CyC2018 已提交
21

C
CyC2018 已提交
22
# 二、使用场景
C
CyC2018 已提交
23

C
CyC2018 已提交
24
## 异步处理
C
CyC2018 已提交
25 26 27

发送者将消息发送给消息队列之后,不需要同步等待消息接收者处理完毕,而是立即返回进行其它操作。消息接收者从消息队列中订阅消息之后异步处理。

C
CyC2018 已提交
28
例如在注册流程中通常需要发送验证邮件来确保注册用户身份的合法性,可以使用消息队列使发送验证邮件的操作异步处理,用户在填写完注册信息之后就可以完成注册,而将发送验证邮件这一消息发送到消息队列中。
C
CyC2018 已提交
29 30 31

只有在业务流程允许异步处理的情况下才能这么做,例如上面的注册流程中,如果要求用户对验证邮件进行点击之后才能完成注册的话,就不能再使用消息队列。

C
CyC2018 已提交
32
## 流量削锋
C
CyC2018 已提交
33 34 35 36 37

在高并发的场景下,如果短时间有大量的请求到达会压垮服务器。

可以将请求发送到消息队列中,服务器按照其处理能力从消息队列中订阅消息进行处理。

C
CyC2018 已提交
38
## 应用解耦
C
CyC2018 已提交
39 40 41 42 43

如果模块之间不直接进行调用,模块之间耦合度就会很低,那么修改一个模块或者新增一个模块对其它模块的影响会很小,从而实现可扩展性。

通过使用消息队列,一个模块只需要向消息队列中发送消息,其它模块可以选择性地从消息队列中订阅消息从而完成调用。

C
CyC2018 已提交
44
# 三、可靠性
C
CyC2018 已提交
45

C
CyC2018 已提交
46
## 发送端的可靠性
C
CyC2018 已提交
47 48 49 50 51

发送端完成操作后一定能将消息成功发送到消息队列中。

实现方法:

C
CyC2018 已提交
52
- 在本地数据库建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息队列中,若转移消息成功则删除消息表中的数据,否则继续重传。
C
CyC2018 已提交
53

C
CyC2018 已提交
54
## 接收端的可靠性
C
CyC2018 已提交
55

C
CyC2018 已提交
56
接收端能够从消息队列成功消费一次消息。
C
CyC2018 已提交
57

C
CyC2018 已提交
58
两种实现方法:
C
CyC2018 已提交
59

C
CyC2018 已提交
60 61
- 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。
- 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号。
C
CyC2018 已提交
62

C
CyC2018 已提交
63
# 参考资料
C
CyC2018 已提交
64

C
CyC2018 已提交
65 66 67 68 69 70
[Observer vs Pub-Sub](http://developers-club.com/posts/270339/)
[消息队列中点对点与发布订阅区别](https://blog.csdn.net/lizhitao/article/details/47723105)
---bottom---CyC---
![](index_files/685a692f-8f76-4cac-baac-b68e2df9a30f.jpg)
![](index_files/ddb5ff4c-4ada-46aa-9bf1-140bdb5e4676.jpg)
![](index_files/bee1ff1d-c80f-4b3c-b58c-7073a8896ab2.jpg)