Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >究竟什么时候该使用MQ?

究竟什么时候该使用MQ?

作者头像
架构师之路
发布于 2020-03-23 10:16:18
发布于 2020-03-23 10:16:18
6490
举报
文章被收录于专栏:架构师之路架构师之路

任何脱离业务的组件引入都是耍流氓。引入一个组件,最先该解答的问题是,此组件解决什么问题。

MQ,互联网技术体系中一个常见组件,究竟什么时候不使用MQ,究竟什么时候使用MQ,MQ究竟适合什么场景,是今天要分享的内容。

MQ是什么?

消息总线(Message Queue),后文称MQ,是一种跨进程的通信机制,用于上下游传递消息。

画外音:这两个进程,一般不在同一台服务器上。

在互联网架构中,MQ经常用做“上下游解耦”:

(1)消息发送方只依赖MQ,不关注消费方是谁;

(2)消息消费方也只依赖MQ,不关注发送方是谁;

画外音:发送方与消费方,逻辑上和物理上都不依赖彼此。

什么时候不使用MQ?

当调用方需要关心消息执行结果时,通常不使用MQ,而使用RPC调用。

ret = PassportService::userAuth(name, pass);

switch(ret){

case(YES) : return YesHTML();

case(NO) : return NoHTML();

case(JUMP) : return 304HTML():

default : return 500HTML();

}

如上例所示,上游调用Passport服务,处理结果不同,业务会走不同的逻辑处理分支(登录成功,登录失败,执行错误等),即“处理结果强依赖”,此时应该使用RPC调用。

画外音:绝大部分情况,应该使用RPC。

此时如果强行使用MQ呢?

如果强行使用MQ通讯,调用方不能直接告之用户登录成功又或失败,则要等待另一个MQ通知回调。这么玩,不但使得编码复杂,还会引入消息丢失的风险,中间多加入一层,多此一举。

究竟什么时候使用MQ呢?

下面四类典型场景,应该使用MQ。

典型场景一:数据驱动的任务依赖

什么是任务依赖?

举个栗子,互联网公司经常在凌晨进行一些数据统计任务,这些任务之间有一定的依赖关系,例如:

(1)task3需要使用task2的输出作为输入;

(2)task2需要使用task1的输出作为输入;

这样的话,tast1, task2, task3之间就有任务依赖关系,必须task1先执行,再task2执行,载task3执行。

对于这类需求,通常怎么实现呢?

常见的玩法是,crontab人工排执行时间表。

如上图,手动设定如下:

(1)task1,0:00执行,经验执行时间为50分钟;

(2)task2,1:00执行(为task1预留10分钟buffer),经验执行时间也是50分钟;

(3)task3,2:00执行(为task2预留10分钟buffer);

crontab手动排表有什么坏处呢?

(1)如果有一个任务执行时间超过了预留buffer的时间,将会得到错误的结果,因为后置任务不清楚前置任务是否执行成功,此时要手动重跑任务,还有可能要调整排班表;

(2)总任务的执行时间很长,总是要预留很多buffer,如果前置任务提前完成,后置任务不会提前开始;

(3)如果一个任务被多个任务依赖,这个任务将会称为关键路径,排班表很难体现依赖关系,容易出错;

(4)如果有一个任务的执行时间要调整,将会有多个任务的执行时间要调整;

无论如何,采用“crontab排班表”的方法,各任务严重耦合,谁用过谁痛谁知道。

画外音:用过的,痛过的,请留言。

应该如何优化呢?

采用MQ解耦。

如上图,任务之间通过MQ来传递“开始”与“结束”的通知:

(1)task1准时开始,结束后发一个“task1 done”的消息;

(2)task2订阅“task1 done”的消息,收到消息后第一时间启动执行,结束后发一个“task2 done”的消息;

(3)task3同理;

采用MQ有什么好处呢?

(1)不需要预留buffer,上游任务执行完,下游任务总会在第一时间被执行;

(2)依赖多个任务,被多个任务依赖都很好处理,只需要订阅相关消息即可;

(3)有任务执行时间变化,下游任务都不需要调整执行时间;

需要特别说明的是,MQ只用来传递上游任务执行完成的消息,并不用于传递真正的输入输出数据

典型场景二:上游不关心执行结果

上游需要关注执行结果时要用“RPC调用”,上游不关注执行结果时,使用MQ。

举个栗子,58同城的很多下游需要关注“用户发布帖子”这个事件,比如:

(1)招聘用户发布帖子后,招聘业务要奖励58豆;

(2)房产用户发布帖子后,房产业务要送2个置顶;

(3)二手用户发布帖子后,二手业务要修改用户统计数据;

对于这类需求,可以采用什么方式实现呢?

比较无脑的,可以使用RPC调用来实现:

帖子发布服务执行完成之后,调用下游招聘业务、房产业务、二手业务,来完成消息的通知。

但事实上,这个通知是否正常正确的执行,帖子发布服务根本不关注。

通过RPC来传递不需要知道处理结果的通知,有什么坏处呢?

(1)帖子发布流程的执行时间增加了;

(2)下游服务当机,可能导致帖子发布服务受影响,上下游逻辑+物理依赖严重;

(3)每当增加一个需要知道“帖子发布成功”信息的下游,修改代码的是帖子发布服务;

画外音:这一点是最恶心的,属于架构设计中典型的反向依赖。

如何来进行优化呢?

采用MQ解耦,代替RPC。

如上图所示:

(1)帖子发布成功后,向MQ发一个消息;

(2)哪个下游关注“帖子发布成功”的消息,主动去MQ订阅;

如此一来,有什么好处呢?

(1)上游执行时间短;

(2)上下游逻辑+物理解耦,除了与MQ有物理连接,模块之间都不相互依赖;

(3)新增一个下游消息关注方,上游不需要修改任何代码;

典型场景三:上游关注执行结果,但执行时间很长

有时候上游需要关注执行结果,但执行结果时间很长(典型的是调用离线处理,或者跨公网调用),也经常使用回调网关+MQ来解耦。

举个栗子,微信支付,跨公网调用微信的接口,执行时间会比较长,但调用方又非常关注执行结果,此时一般怎么玩呢?

一般采用“回调网关+MQ”方案来解耦:

(1)调用方直接跨公网调用微信接口;

(2)微信返回调用成功,此时并不代表返回成功;

(3)微信执行完成后,回调统一网关;

(4)网关将返回结果通知MQ;

(5)请求方收到结果通知;

这里需要注意的是,不应该由回调网关来RPC通知上游来通知结果,如果是这样的话,每次新增调用方,回调网关都需要修改代码,仍然会反向依赖,使用回调网关+MQ的方案,新增任何对微信支付的调用,都不需要修改代码。

结尾总结

MQ是一个互联网架构中常见的解耦利器。

什么时候不使用MQ?

上游实时关注执行结果,通常采用RPC。

什么时候使用MQ?

(1)数据驱动的任务依赖;

(2)上游不关心多下游执行结果;

(3)异步返回执行时间长;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
到底什么时候该使用MQ?
一、缘起 一切脱离业务的架构设计与新技术引入都是耍流氓。 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题。 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什么问题(详见《互联网架构为什么要做微服务?》)。 最近分享了几篇MQ相关的文章: 《MQ如何实现延时消息》 《MQ如何实现消息必达》 《MQ如何实现幂等性》 不少网友询问,究竟什么时候使用MQ,MQ究竟适合什么场景,故有了此文。 二、MQ是干嘛的 消息总线(Message Queue),后文称MQ,是一种跨进程的通
架构师之路
2018/03/01
2.4K0
到底什么时候该使用MQ?
消息中间件MQ科普
消息队列(Message Queue),是一种跨进程的通信机制,用于上下游传递消息。
乐心湖
2020/08/10
8720
01.MQ简介
当你刚刚为公司的一个Web应用实现了一个很棒的注册模块。它看起来简洁、高效。在你沾沾自喜的时候,你的leader对你说,现在咱们需要在注册成功后对用户发送一条短信。过了一段时间后,你的leader又对你说,现在咱们需要在注册成功后对用户发送一条邮件,点击邮件中的激活链接后才算是真正的注册成功。又过了一段时间,你的leader又对你说,现在咱们需要在注册成功后对用户发送一条成功赠送金币的迎新消息。又过了一段时间后…
qubianzhong
2019/08/14
6280
MQ,互联网架构解耦神器
一个架构常识:当调用方需要关心执行结果,通常使用RPC调用。 ret = PassportService::userAuth(name, pass); switch(ret){ case(YES)
架构师之路
2018/03/02
1.5K0
MQ,互联网架构解耦神器
为什么说,MQ,是互联网架构的解耦神器?
耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。
架构师之路
2021/09/07
5600
MQ不丢消息,究竟是怎么实现的?
通过消息队列(MsgQueue,MQ)发送任务和消息,万一MQ重启了怎么办?能否保证MQ不丢消息?
架构师之路
2020/06/05
1.2K0
RocketMQ知识(及开发实战)
image.png 一般采用“回调网关+MQ”方案来解耦: a、调用方直接跨公网调用微信接口 b、微信返回调用成功,此时并不代表返回成功 c、微信执行完成后,回调统一网关 d、网关将返回结果通知MQ e、请求方收到结果通知
用户5325874
2020/01/16
1K0
RocketMQ知识(及开发实战)
信用算力实现金融级数据服务的实践
微服务架构已成为了互联网的热门话题之一,而这也是互联网技术发展的必然阶段。然而,微服务概念的提出者 Martin Fowler 却强调:分布式调用的第一原则就是不要分布式。
heidsoft
2019/04/25
8670
信用算力实现金融级数据服务的实践
主流的消息队列MQ比较,详解MQ的4类应用场景
消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。
Java
2018/09/26
8.1K0
主流的消息队列MQ比较,详解MQ的4类应用场景
“ID串行化”是如何保证消息顺序性的?
在《消息顺序性为何这么难?》中,介绍了一种为了保证“所有群友展示的群消息时序都是一致的”所使用的“ID串行化”的方法:让同一个群gid的所有消息落在同一台服务器上处理。
Java架构师必看
2021/10/20
8510
为什么说解耦的战术,决定了架构的高度?
架构设计中,大家都不喜欢耦合,但有哪些典型的耦合是我们系统架构设计中经常出现的,又该如何优化?这里列举了6个点:IP、jar包、数据库、服务、消息、扩容。这些点,如果设计不慎,都会导致系统一些耦合,这些点基本都是大家实际遇到的痛点,今天我将跟大家分享如何用常见的方案去解除这些耦合。
技术zhai
2019/02/28
1.2K0
为什么说解耦的战术,决定了架构的高度?
读服务+写服务分离架构,我坚决反对!
第一点:对于调用方而言,调用同一个基础服务,要访问其RPC接口,究竟调用读服务,还是写服务,容易困惑。
架构师之路
2021/07/15
4340
读服务+写服务分离架构,我坚决反对!
互联网架构,究竟为什么需要配置中心?
配置中心是互联网架构体系中很重要的一块,但为什么会有配置中心,是不是一开始就要有配置中心,它究竟解决什么问题,这是今天要讨论的问题。
架构师之路
2020/03/23
2.9K1
互联网架构,究竟为什么需要配置中心?
ServiceMesh究竟解决什么问题?
服务网格(ServiceMesh)这两年异常之火,号称是下一代微服务架构,接下来两个月,准备系统性的写写这个东西,希望能够让大家对最新的架构技术,有个初步的了解。
Java高级攻城狮
2019/04/24
1.4K0
ServiceMesh究竟解决什么问题?
麻了,这让人绝望的大事务提交
继上次的if else优化也有段时间了,最近小猫又又又着道了,接手的那个项目又遇到了坑爹的地方,经常性的报死锁异常,经常性的主从延迟......通过报错信息按图索骥,发现代码是这样的。
程序员老猫
2024/01/15
3350
麻了,这让人绝望的大事务提交
高性能sparkStreaming 实现
在讲解sparkStreaming优化方法之前先看几个sparkStreaming的监控指标:
Flink实战剖析
2022/04/18
5500
高性能sparkStreaming 实现
必须知道的RPC内核细节(值得收藏)!!!
微服务分层架构,之前聊得很多了,微服务离不开RPC框架,RPC框架的原理、实践及细节,今天和大家聊一聊。 文章较长,1万字左右,建议提前收藏。 服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: (1)服务A:欧洲团队维护,技术背景是Java; (2)服务B:美洲团队维护,用C++实现; (3)服务C:中国团队维护,技术栈是go; 服务的上游调用方,按照接口、协议即可完成对远端服务的调用。 但实际上,大部分互联网公司,研发团队规模
架构师之路
2022/06/24
7580
必须知道的RPC内核细节(值得收藏)!!!
每秒几万次MySQL交互,搜狗纯异步MySQL客户端开源了!
今年看源码,之前推荐过一个框架《单机40万QPS,搜狗WF框架,今年最值得学习的开源代码》,随着源码阅读的越来越深入,发现了WF框架一个非常独特的地方:高性能纯异步MySQL客户端,非常有意思,今天和大家介绍一下自己的学习心得。
架构师之路
2020/11/03
1.6K0
每秒几万次MySQL交互,搜狗纯异步MySQL客户端开源了!
如何发现架构中的耦合(5大场景)?(第36讲)
答:架构痛点是别人,被动修改配合方却是你。这是一个架构设计上“反向依赖”的问题,这就是典型的耦合特征。
架构师之路
2025/01/17
1410
如何发现架构中的耦合(5大场景)?(第36讲)
如何最小改变架构,快速实现流控的?(第34讲)
这两种模式,都可能造成流量冲击:流量从端到站点,到服务,到数据库,流量会一路透传下来,引发雪崩。
架构师之路
2025/01/14
680
如何最小改变架构,快速实现流控的?(第34讲)
相关推荐
到底什么时候该使用MQ?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档