到底什么时候该使用MQ
最后更新于:2022-04-02 04:12:54
[TOC]
## 概述
消息总线(Message Queue),后文称MQ,是一种跨进程的通信机制,用于上下游传递消息
## 什么时候不使用消息总线
调用方实时依赖执行结果的业务场景,请使用调用,而不是MQ
如:用户登录场景
## 什么时候使用MQ
### 数据驱动的任务依赖
任务之间有一定的**依赖关系**
比如:
1. task3需要使用task2的输出作为输入
2. ask2需要使用task1的输出作为输入
实例:
1. task1准时开始,结束后发一个“task1 done”的消息
2. task2订阅“task1 done”的消息,收到消息后第一时间启动执行,结束后发一个“task2 done”的消息
3. task3同理
> MQ只用来传递上游任务执行完成的消息,并不用于传递真正的输入输出数据
### 上游不关心执行结果
如:关注“用户发布帖子”这个事件,比如招聘用户发布帖子后,招聘业务要奖励58豆
采用MQ解耦:
1. 帖子发布成功后,向MQ发一个消息
2. 哪个下游关注“帖子发布成功”的消息,主动去MQ订阅
采用MQ的优点是:
1. 上游执行时间短
2. 上下游逻辑+物理解耦,除了与MQ有物理连接,模块之间都不相互依赖
3. 新增一个下游消息关注方,上游不需要修改任何代码
### 上游关注执行结果,但执行时间很长
如:调用离线处理或者跨公网调用
实例:微信支付,跨公网调用微信的接口,执行时间会比较长,但调用方又非常关注执行结果
一般采用“回调网关+MQ”方案来解耦:
1. 调用方直接跨公网调用微信接口
2. 微信返回调用成功,此时并不代表返回成功
3. 微信执行完成后,回调统一网关
4. 网关将返回结果通知MQ
5. 请求方收到结果通知
';