File tree 1 file changed +7
-6
lines changed
docs/system-design/data-communication
1 file changed +7
-6
lines changed Original file line number Diff line number Diff line change 39
39
40
40
### (1) 通过异步处理提高系统性能(削峰、减少响应所需时间)
41
41
42
- ![ 通过异步处理提高系统性能] ( https://user-gold-cdn.xitu.io/2018/4/21/162e63a8e34ba534?w=910&h=350&f=jpeg&s=29123 )
42
+ ![ 通过异步处理提高系统性能] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/Asynchronous-message-queue.png )
43
43
如上图,** 在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即 返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。**
44
44
45
45
通过以上分析我们可以得出** 消息队列具有很好的削峰作用的功能** ——即** 通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。** 举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
46
- ![ 合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击] ( https://user-gold-cdn.xitu.io/2018/4/21/162e64583dd3ed01?w=780&h=384&f=jpeg&s=13550 )
46
+
47
+ ![ 削峰] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/削峰-消息队列.png )
47
48
48
49
因为** 用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败** 。因此使用消息队列进行异步处理之后,需要** 适当修改业务流程进行配合** ,比如** 用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功** ,以免交易纠纷。这就类似我们平时手机订火车票和电影票。
49
50
50
51
### (2) 降低系统耦合性
51
52
52
- 我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。
53
+ 使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧:
54
+
55
+ ![ 解耦] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/消息队列-解耦.png )
53
56
54
- 我们最常见的** 事件驱动架构** 类似生产者消费者模式,在大型网站中通常用利用消息队列实现事件驱动结构。如下图所示:
55
-
56
- ![ 利用消息队列实现事件驱动结构] ( https://user-gold-cdn.xitu.io/2018/4/21/162e6665fa394b3b?w=790&h=290&f=jpeg&s=14946 )
57
+ 生产者(客户端)发送消息到消息队列中去,接受者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合, 这显然也提高了系统的扩展性。
57
58
58
59
** 消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。** 从上图可以看到** 消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合** ,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。** 对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计** 。
59
60
You can’t perform that action at this time.
0 commit comments