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

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

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

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

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

对于这类需求,常见的实现方式是,使用cron人工排执行时间表:

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

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

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

这种方法的坏处是:

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

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

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

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

无论如何,采用“cron排班表”的方法,各任务耦合,谁用过谁痛谁知道(采用此法的请评论留言)

优化方案是,采用MQ解耦:

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

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

3)task3同理

采用MQ的优点是:

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

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

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

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

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

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

举个栗子,58同城的很多下游需要关注“用户发布帖子”这个事件,比如招聘用户发布帖子后,招聘业务要奖励58豆,房产用户发布帖子后,房产业务要送2个置顶,二手用户发布帖子后,二手业务要修改用户统计数据。

对于这类需求,常见的实现方式是,使用调用关系:

帖子发布服务执行完成之后,调用下游招聘业务、房产业务、二手业务,来完成消息的通知,但事实上,这个通知是否正常正确的执行,帖子发布服务根本不关注。

这种方法的坏处是:

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

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

3)每当增加一个需要知道“帖子发布成功”信息的下游,修改代码的是帖子发布服务,这一点是最恶心的,属于架构设计中典型的依赖倒转

优化方案是,采用MQ解耦:

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

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

采用MQ的优点是:

1)上游执行时间短

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

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

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

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

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

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

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

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

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

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

5)请求方收到结果通知

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

到底什么时候该使用MQ相关推荐

  1. 到底什么时候该使用MQ 1

      MQ是干嘛的 消息队列(Message Queue),后文称MQ,是一种跨进程的通信机制,用于上下游传递消息. 在互联网架构中,MQ是一种非常常见的上下游"逻辑解耦+物理解耦" ...

  2. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  3. 信用算力基于 RocketMQ 实现金融级数据服务的实践

    微服务架构已成为了互联网的热门话题之一,而这也是互联网技术发展的必然阶段.然而,微服务概念的提出者 Martin Fowler 却强调:分布式调用的第一原则就是不要分布式. 纵观微服务实施过程中的弊端 ...

  4. 1对多业务,数据库水平切分架构一次搞定 | 架构师之路

    1对多业务,数据库水平切分架构一次搞定 | 架构师之路 原创 2017-07-10 58沈剑 架构师之路 架构师之路 架构师之路 微信号 road5858 功能介绍 架构师之路,坚持撰写接地气的架构文 ...

  5. 耗时一年,乘风破浪:一群牛逼的人,做成了一件牛逼的事儿!

    这是一个 "蓄谋已久" 的计划 它长达一年,多位 BAT 顶尖技术专家参与其中,呕心沥血! 一年的时间潜心研发,我们设计开发出一个80万行+代码,且业务极度复杂的大型电商平台,命名 ...

  6. 计算压力倍增,携程度假起价引擎架构演变

    一.背景介绍 1. 什么是度假起价引擎? 首先,解释一下什么是度假起价引擎.度假每个旅游线路涉及到不同的出发地,不同的出发地下有不同可出发班期,每个班期都有对应的这一天的价格.旅游产品的价格由多个资源 ...

  7. 消息队列(MQ)到底能干什么?

    一.什么是MQ? MQ全称为Message Queue,也就是消息队列,是应用程序和应用程序之间的通信方法. 二.MQ能用来干什么? 能用来干什么,也就是MQ的适用场景. 在微服务盛行的当下,MQ被使 ...

  8. 牛逼哄哄的 MQ 到底有啥用?

    作者:卓庆森 http://www.cnblogs.com/zhuoqingsen/p/MQ.html 我走过最长的路是你的套路 女:二号男嘉宾,假如我们牵手成功后,你会买名牌包包给我吗? 男:那你会 ...

  9. websphere mq 查看队列中是否有数据_全网最全的 “消息队列”

    消息队列的使用场景 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景. 1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信. 引入消息队列后架构如下: ...

最新文章

  1. ios图片放大之后如何不模糊_图片怎样放大后不模糊 图片放大不失真的方法步骤...
  2. vi在一般指令模式下几个实用的命令
  3. 谈谈我对js中闭包的理解
  4. 【学习记录】网络层——IP数据报(格式与分片)
  5. 文字color颜色渐变(可一直变换) - 代码篇
  6. 三元表达式、列表推导式、生成器表达式、递归、内置函数、匿名函数
  7. 【声辐射】——不同坐标系下的格林函数
  8. 网络安装Citrix XenServer
  9. linux驱动程序文件,急,linux驱动程序是对的为什么生成不了.o驱动程序文件
  10. 迅捷cad_迅捷数组
  11. Linux之fd与dup2复制fd用法
  12. 使用wsimport构建WebService客户端
  13. Docker 镜像和容器
  14. oracle触发器函数,oracle 存储过程、函数和触发器用法实例详解
  15. Python学习笔记(2)-基础语法
  16. bzoj3864-hdu4899-Hero meet devil
  17. windows如何删除管理员权限的文件夹
  18. 高防IP与高防服务器的区别
  19. 深度学习使用CNN进行图像分类
  20. 高通camx configure_streams 初始化 和 usecase 创建流程 详解(五)

热门文章

  1. 马云出 1000 亿做阿里达摩院:产品卖到全球了,他说科学研究也要跟上
  2. 5G 除了上网快,还有什么用?
  3. 程序员 35 岁就该退休了吗?
  4. “我只需一个周末就可以构建出这个应用!”
  5. 一个三本程序猿的大厂逆袭之路
  6. 想获得50亿专项激励?关于穿山甲新星助推计划你必须了解的几件事
  7. Grails GORM查询总结
  8. ubuntu 下非交互式执行远程shell命令
  9. java-结合c3p0封装的db 事务 类
  10. “新浪朋友”首先要满足朋友需求