Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
醒狮指南
JavaGuide
提交
29b1e898
J
JavaGuide
项目概览
醒狮指南
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
29b1e898
编写于
10月 29, 2020
作者:
G
guide
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update message-queue.md
上级
a087cf1c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
30 deletion
+23
-30
docs/system-design/distributed-system/message-queue/message-queue.md
...-design/distributed-system/message-queue/message-queue.md
+23
-30
未找到文件。
docs/system-design/distributed-system/message-queue/message-queue.md
浏览文件 @
29b1e898
<!-- MarkdownTOC -->
-
[
消息队列其实很简单
](
#消息队列其实很简单
)
-
[
一 什么是消息队列
](
#一-什么是消息队列
)
-
[
二 为什么要用消息队列
](
#二-为什么要用消息队列
)
-
[
\(1\) 通过异步处理提高系统性能(削峰、减少响应所需时间)
](
#1-通过异步处理提高系统性能削峰减少响应所需时间
)
-
[
\(2\) 降低系统耦合性
](
#2-降低系统耦合性
)
-
[
三 使用消息队列带来的一些问题
](
#三-使用消息队列带来的一些问题
)
-
[
四 JMS VS AMQP
](
#四-jms-vs-amqp
)
-
[
4.1 JMS
](
#41-jms
)
-
[
4.1.1 JMS 简介
](
#411-jms-简介
)
-
[
4.1.2 JMS两种消息模型
](
#412-jms两种消息模型
)
-
[
4.1.3 JMS 五种不同的消息正文格式
](
#413-jms-五种不同的消息正文格式
)
-
[
4.2 AMQP
](
#42-amqp
)
-
[
4.3 JMS vs AMQP
](
#43-jms-vs-amqp
)
-
[
五 常见的消息队列对比
](
#五-常见的消息队列对比
)
<!-- /MarkdownTOC -->
# 消息队列其实很简单
...
...
@@ -24,36 +5,48 @@
## 一 什么是消息队列
我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些消息队列。
**我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。**
![
Message queue
](
https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/message-queue-small.png
)
另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3...对于消费者就会按照1,2,3...的顺序来消费。但是偶尔也会出现消息被消费的顺序不对的情况,比如某个消息消费失败又或者一个 queue 多个consumer 也会导致消息被消费的顺序不对,我们一定要保证消息被消费的顺序正确
。
消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性
。
除了上面说的消息消费顺序的问题,使用消息队列,我们还要考虑如何保证消息不被重复消费?如何保证消息的可靠性传输(如何处理消息丢失的问题)?......等等问题。所以说使用消息队列也不是十全十美的,使用它也会让系统可用性降低、复杂度提高,另外需要我们保障一致性等问题
。
我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的
。
## 二 为什么要用消息队列
我觉得使用消息队列主要有
两
点好处:
我觉得使用消息队列主要有
三
点好处:
1.
通过异步处理提高系统性能(削峰、减少响应所需时间)
2.
降低系统耦合性。
1.
**通过异步处理提高系统性能(减少响应所需时间)。**
2.
**削峰/限流**
3.
**降低系统耦合性。**
如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。
《大型网站技术架构》第四章和第七章均有提到消息队列对应用性能及扩展性的提升。
### (1) 通过异步处理提高系统性能(削峰、减少响应所需时间)
### 2.1 通过异步处理提高系统性能(减少响应所需时间)
![
通过异步处理提高系统性能
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/Asynchronous-message-queue.png
)
如上图,
**在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。**
通过以上分析我们可以得出
**消息队列具有很好的削峰作用的功能**
——即
**通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。**
举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
![
削峰
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/削峰-消息队列.png
)
将用户的请求数据存储到消息队列之后就立即返回结果。随后,系统再对消息进行消费。
因为
**用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败**
。因此使用消息队列进行异步处理之后,需要
**适当修改业务流程进行配合**
,比如
**用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功**
,以免交易纠纷。这就类似我们平时手机订火车票和电影票。
### (2) 降低系统耦合性
### 2.2 削峰/限流
**先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。**
举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
![
削峰
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/削峰-消息队列.png
)
### 2.3 降低系统耦合性
使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录