Skip to content

Commit 957e8c5

Browse files
committed
docs(mq): add note about why use mq
1 parent cb25db1 commit 957e8c5

1 file changed

Lines changed: 24 additions & 11 deletions

File tree

plugins/mq/mq.md

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
11
### 学习笔记
22
- [什么时候使用MQ]()
33
- [常见问题]()
4+
- [为什么要用消息队列?(消息队列的应用场景?)](#为什么要用消息队列?(消息队列的应用场景?))
45

56
* MQ总结
67
* 消息总线(Message Queue),是一种跨进程的通信机制,用于上下游传递消息。
7-
* 在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。
8+
* 消息队列的本质是一种“新进先出”的数据结构
9+
* 常用场景:解耦、异步、削峰
810
* 什么时候不使用MQ?
911
* 上游实时关注执行结果
1012
* 什么时候使用MQ?
1113
* 数据驱动的任务依赖。D依赖C,C依赖B,B依赖A,
1214
* 上游不关心多下游执行结果
1315
* 异步返回执行时间长
14-
* QMQ是去哪儿网内部广泛使用的消息中间件,自2012年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。目前在公司内部日常消息qps在60W左右,生产上承载将近4W+消息topic,消息的端到端延迟可以控制在10ms以内。
15-
* Apache RocketMQ is a distributed messaging and streaming platform with low latency, high performance and reliability, trillion-level capacity and flexible scalability.
16-
* ActivyMQ,RabbitMQ搭建集群需要自己配置HAV
16+
* 常见产品
17+
* ActivyMQ
18+
* RabbitMQ
19+
* QMQ是去哪儿网内部广泛使用的消息中间件,自2012年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。目前在公司内部日常消息qps在60W左右,生产上承载将近4W+消息topic,消息的端到端延迟可以控制在10ms以内。
20+
* Apache RocketMQ is a distributed messaging and streaming platform with low latency, high performance and reliability, trillion-level capacity and flexible scalability.
21+
* Kafka
22+
* MQTT
1723

1824
### 消息队列的技术选型
1925
消息队列及常见消息队列介绍 - 云+社区...
2026
http://note.youdao.com/noteshare?id=7c550bb62a6597091e4533fbb6b920c1&sub=wcp155548841293021
2127

2228
### 消息队列优势
2329
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势:
24-
* 解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
25-
复杂的应用里会存在多个子系统, 比如在电商应用中有订单系统、库存系统、物流系统 支付系统等,这个时候如果各个子系统之间的耦合性太高,整体系统的可用性就会大幅降低,多个低错误率的子系统糅合在一起,得到的是一个高错误率的整体系统。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。当转变成基于消息队列的方式后,系统可用性就高多了,比如物流系统因为发生故障,需要几分钟的时间来修 ,在这几分钟的时间里,物流系统要处理的内容被缓存在消息队列里,用户的下单操作可以正常完成。当物流系统恢复后,补充处理存储在消息队列里的订单信息即可,终端用户感知不到物流系统发生过几分钟的故障。
26-
* 削峰(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
27-
每年的双十一,淘宝的很多活动都在0点的时候开启,大部分应用系统流量会在瞬间猛增,这个时候如果没有缓冲机制,不可能承受住短时大流量的冲击。通过利用消息队列,把大量的请求暂存起来,分散到相对长的一段时间内处理,能大大提高系统的稳定性和用户体验。举个例子,如果订单系统每秒最多能处理1万次下单,这个处理能力应对正常时段的下单是绰绰有余的,正常时段我们下单后一秒内就能返回结果。双十一零点的时候,如果没有消息队列这种缓冲机制,为了保证系统稳定,只能在订单超过一万次后就不允许用户下单了;如果有消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单后十几秒才能收到下单成功的状态,但是也比不能下单的体验要好。使用消息队列进行流量消峰,很多时候不是因为能力不够,而是出于经济性的考量。比如有的业务系统,流量最高峰也不会超过一万QPS ,而平时只有一千左右的 QPS 这种情况下我们就可以用个普通性能的服务器(只支持一千左右的 QPS 就可以),然后加个消息队列作为高峰期的缓冲,无须花大笔资金部署能处理上万 QPS 的服务器。
28-
* 异步(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统,应用间并发处理消息,相比串行处理,减少处理时间)
29-
比如用户注册的消息,需要被数据部门处理,也要被业务部门处理,如果串行调用,会导致用户注册的流程耗时,这时候采用消息异步处理,用户完成基本的注册后只需要写入消息,各个子系统订阅消费此消息。
30-
* 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)
30+
*
31+
32+
33+
3134
除了上面列出的应用解棉、流量消峰、消息分发等功能外,消息队列还有保证最终一致性、方便动态扩容等功能。
3235

3336

@@ -41,5 +44,15 @@ http://note.youdao.com/noteshare?id=7c550bb62a6597091e4533fbb6b920c1&sub=wcp1555
4144
7. 如何保证消息的顺序性?
4245
8. 基于MQ的分布式事务实现
4346

47+
为什么要用消息队列?(消息队列的应用场景?)
48+
----------------------------------------
49+
消息队列的本质是一个先进先出的数据结构。它能在解耦、异步、削峰上提供很好的能力。
50+
1. 解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
51+
复杂的应用里会存在多个子系统, 比如在电商应用中有订单系统、库存系统、物流系统 支付系统等,这个时候如果各个子系统之间的耦合性太高,整体系统的可用性就会大幅降低,多个低错误率的子系统糅合在一起,得到的是一个高错误率的整体系统。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。当转变成基于消息队列的方式后,系统可用性就高多了,比如物流系统因为发生故障,需要几分钟的时间来修 ,在这几分钟的时间里,物流系统要处理的内容被缓存在消息队列里,用户的下单操作可以正常完成。当物流系统恢复后,补充处理存储在消息队列里的订单信息即可,终端用户感知不到物流系统发生过几分钟的故障。
52+
2. 异步(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统,应用间并发处理消息,相比串行处理,减少处理时间)
53+
比如用户注册的消息,需要被数据部门处理,也要被业务部门处理,如果串行调用,会导致用户注册的流程耗时,这时候采用消息异步处理,用户完成基本的注册后只需要写入消息,各个子系统订阅消费此消息。
54+
3. 削峰(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
55+
每年的双十一,淘宝的很多活动都在0点的时候开启,大部分应用系统流量会在瞬间猛增,这个时候如果没有缓冲机制,不可能承受住短时大流量的冲击。通过利用消息队列,把大量的请求暂存起来,分散到相对长的一段时间内处理,能大大提高系统的稳定性和用户体验。举个例子,如果订单系统每秒最多能处理1万次下单,这个处理能力应对正常时段的下单是绰绰有余的,正常时段我们下单后一秒内就能返回结果。双十一零点的时候,如果没有消息队列这种缓冲机制,为了保证系统稳定,只能在订单超过一万次后就不允许用户下单了;如果有消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单后十几秒才能收到下单成功的状态,但是也比不能下单的体验要好。使用消息队列进行流量消峰,很多时候不是因为能力不够,而是出于经济性的考量。比如有的业务系统,流量最高峰也不会超过一万QPS ,而平时只有一千左右的 QPS 这种情况下我们就可以用个普通性能的服务器(只支持一千左右的 QPS 就可以),然后加个消息队列作为高峰期的缓冲,无须花大笔资金部署能处理上万 QPS 的服务器。
56+
4. 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)
4457

4558
![MQ详细对比](img/mq-compare.png)

0 commit comments

Comments
 (0)