[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. 请求方收到结果通知