标签:设计 互联网公司 def 时间 人工 方案 经验 nbsp 场景
任何脱离业务的组件引入都是耍流氓。引入一个组件,最先该解答的问题是,此组件解决什么问题。
MQ,互联网技术体系中一个常见组件,究竟什么时候不使用MQ,究竟什么时候使用MQ,MQ究竟适合什么场景,是今天要分享的内容。
MQ是什么?消息总线(Message Queue),后文称MQ,是一种跨进程的通信机制,用于上下游传递消息。画外音:这两个进程,一般不在同一台服务器上。
在互联网架构中,MQ经常用做“上下游解耦”:(1)消息发送方只依赖MQ,不关注消费方是谁;(2)消息消费方也只依赖MQ,不关注发送方是谁;
画外音:发送方与消费方,逻辑上和物理上都不依赖彼此。
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)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来传递“开始”与“结束”的通知:(1)task1准时开始,结束后发一个“task1 done”的消息;(2)task2订阅“task1 done”的消息,收到消息后第一时间启动执行,结束后发一个“task2 done”的消息;(3)task3同理; 采用MQ有什么好处呢?(1)不需要预留buffer,上游任务执行完,下游任务总会在第一时间被执行;(2)依赖多个任务,被多个任务依赖都很好处理,只需要订阅相关消息即可;(3)有任务执行时间变化,下游任务都不需要调整执行时间; 需要特别说明的是,MQ只用来传递上游任务执行完成的消息,并不用于传递真正的输入输出数据。 典型场景二:上游不关心执行结果
比较无脑的,可以使用RPC调用来实现:帖子发布服务执行完成之后,调用下游招聘业务、房产业务、二手业务,来完成消息的通知。
如上图所示:(1)帖子发布成功后,向MQ发一个消息;(2)哪个下游关注“帖子发布成功”的消息,主动去MQ订阅; 如此一来,有什么好处呢?(1)上游执行时间短;(2)上下游逻辑+物理解耦,除了与MQ有物理连接,模块之间都不相互依赖;(3)新增一个下游消息关注方,上游不需要修改任何代码; 典型场景三:上游关注执行结果,但执行时间很长
一般采用“回调网关+MQ”方案来解耦:(1)调用方直接跨公网调用微信接口;(2)微信返回调用成功,此时并不代表返回成功;(3)微信执行完成后,回调统一网关;(4)网关将返回结果通知MQ;(5)请求方收到结果通知; 这里需要注意的是,不应该由回调网关来RPC通知上游来通知结果,如果是这样的话,每次新增调用方,回调网关都需要修改代码,仍然会反向依赖,使用回调网关+MQ的方案,新增任何对微信支付的调用,都不需要修改代码。 结尾总结MQ是一个互联网架构中常见的解耦利器。
什么时候不使用MQ?上游实时关注执行结果,通常采用RPC。 什么时候使用MQ?(1)数据驱动的任务依赖;(2)上游不关心多下游执行结果;(3)异步返回执行时间长;
标签:设计 互联网公司 def 时间 人工 方案 经验 nbsp 场景
原文地址:https://www.cnblogs.com/lgj8/p/12117940.html