作者简介:李智慧,前阿里巴巴技术专家 。本文选自:拉勾教育专栏《架构师的36项修炼》就程序员而言,日后的职业发展可以走3个方向:专攻技术深度、转团队管理、晋升架构师 。
成为一名优秀的架构师,是大多数技术人的追求 。
但资深架构师的出现几率仅约为0.3%,如果想在3-5年后稳坐金字塔尖,必须有扎实的代码功底和项目积累,也要意识地培养技术广度和架构思维能力 。多学习牛人经验也可获益良多 。
我是李智慧,我从事架构已有20多年 。屏幕前的你,既然选择了架构,就要踏实学好每一块知识 。今天我们来讲分布式消息队列MQ 。在本篇幅中,我会主要介绍同步架构和异步架构的区别 。
本文选自:拉勾教育专栏《架构师的36项修炼》见文末了解更多
文章插图
01 同步调用
所谓的同步调用,就是说从请求的发起一直到最终的处理完成期间,请求的调用方一直在同步阻塞等待调用的处理完成 。
我们看一下图片中的例子,在这个例子中客户端代码ClientCode,需要执行发送邮件sendEmail这样一个操作,它会调用EmailService进行发送 。
而EmailService会调用SmtpEmailAdapter这样一个类来进行处理,而这个类会调用远程的一个服务,通过SMTP和TCP协议把请求发送给它 。
而远程服务器收到消息以后会对消息进行一系列的操作,然后将邮件发送出去,再进行返回 。
Adapter收到返回后,再返回给EmailService,EmailService收到返回后再把返回结果返回给Clientcode 。
文章插图
ClientCode在sendEmail发出请求后,就一直都阻塞在这里,等待最终调用结果的返回,是成功还是失败 。因为这个过程是阻塞等待的,所以这个过程也就是同步调用 。
文章插图
02 异步调用
与同步调用相反的是异步调用 。异步调用过程,我们同样看刚刚发送邮件的例子,用户Clientcode调用EmailService以后,EmailService会把这个调用请求发送给消息队列,然后就立即返回了 。
Clientcode收到返回以后继续向下处理,不会继续阻塞等待 。实际上消息发送到Queue后,还没有被处理,我们看到后面的消息消费,其实要比EmailService返回可能还要晚一点,EmailService返回以后消息才会被消费处理 。
有一个QueueConsumer消息队列的消费者,从消息队列中取出这个消息,再把这个消息发送给SmtpAdapter,也就是调用SmtpAdapter 。
处理逻辑跟同步调用一样,SmtpAdapter通过SMTP的通讯协议,把消息发送给远程的一个服务器,进行邮件发送,通过RemoteServer进行处理,处理完了收到返回,再把返回结果通知消息队列Queue 。
我们看到,在这个过程中,客户端的调用,也就是应用程序的调用,和业务逻辑真正发送邮件的操作是不同步的 。
在进行邮件发送操作的处理过程中,客户端的代码已经返回了,它可以继续进行自己的后续操作,而不需要等待邮件的发送,这就叫做异步调用 。
本文选自:拉勾教育专栏《架构师的36项修炼》见文末了解更多
文章插图
使用异步调用架构的主要手段,就是通过消息队列构建 。这是它的架构图 。
消息的生产者将消息发送到消息队列以后,由消息的消费者从消息队列中获取消息,然后进行业务逻辑的处理,消息的生产者和消费者是异步处理的,彼此不会等待阻塞,所以叫做异步架构 。
文章插图
【从架构师到 CTO, 你还有多远的路要走?】使用消息队列构建一个异步调用架构,你需要了解3种角色,一种是消息的生产者,一种是消息队列,还有一种是消息的消费者 。
文章插图
01消息的生产者
消息的生产者是客户端应用程序代码的一部分,用来初始化异步调用处理流程 。
在基于消息队列的处理中,生产者的职责非常少,它要做的就是创建一个合法的消息,并把这个消息发送到消息队列中,由应用开发者决定生产者的代码在哪里执行,什么时候发送消息 。
推荐阅读
- 记者弃文从商卖茶叶,高档茶叶价格下降
- 乳头挠破了怎么办?
- 范振钰|钓鱼大师的饵料值得信服吗?进阶换饵鱼不认,为何蓝鲫有靠谱标签
- 男保姆|60岁女士自述:自从雇请男保姆后,心情好,生活质量也好了
- 游戏|法师哭了:《艾尔登法环》蓝秘密露滴削成5秒 官方称是Bug
- 是时候更新手里的武器了—Jetpack架构组件简析
- 手把手教你直接从应用店为Chrome浏览器安装超好用插件
- MySQL主从延时这么长,要怎么优化?
- 30名工程师,历时1300天打造,又一“国产”AI框架开源了
- 商人|百万粉丝的钓鱼大师,天天直播割韭菜,神经诱鱼小药纯属江湖骗术