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消息队列及常见消息队列介绍 - 云+社区...
2026http://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
41447 . 如何保证消息的顺序性?
42458 . 基于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