# 《并发设计模式》第58章-半同步半异步模式-到底什么是半同步半异步模式

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:了解半同步半异步模式的核心原理与使用场景,初步掌握半同步半异步模式的应用场景,能够初步结合自身项目实际场景思考如何将半同步半异步模式灵活应用到自身实际项目中。

大家好,我是冰河~~

半同步半异步模式兼顾同步和异步的优点,它可以使用同步任务和异步任务的来共同完成任务。半同步半异步模式是一个分层架构,主要包含异步任务层、消息队列层和同步任务层,核心思想就是适当的分解系统中的任务,将各个子任务适当的落入比较合适的分层中。

# 一、故事背景

小菜又接到一个在用户下单并成功支付后,向用户的手机发送短信,告知用户支付系统余额的消费情况,以及当前的余额的需求。小菜觉得需求很简单,于是很快速的开发完功能,交付测试后,返回的报告确实性能很差。但是以小菜目前的能力无法独立优化此时遇到的性能问题。在老王的帮助下,不仅分析出了哪里存在性能问题,更是知道了这种场景下非常适合半同步半异步模式。那到底什么是半同步半异步模式呢?

小菜在网上找了很多资料,也没弄明白到底什么是半同步半异步模式,在老王的耐心讲解下,小菜最终算是彻底搞懂了什么是半同步半异步模式。

# 二、执行流程

半同步半异步的执行流程相对也比较简单,它可以分成异步任务层、消息队列层和同步任务层,整体流程如图58-1所示。


可以看到,半同步半异步模式中,用户访问系统时,请求会先进入异步任务层,异步任务层会将请求访问消息队列层后立即返回,同步任务层会消费消息队列层的请求,执行相应的业务逻辑,得出最终的结果数据。用户层可以通过定时轮询的方式来获取同步任务层的结果数据。

# 三、半同步半异步模式类图

半同步半异步模式主要包含异步任务层、消息队列层和同步任务层,类图如图58-2所示。


其中,每个类的具体职责如下所示。

  • AsyncTask类:异步任务层的类,主要负责接收用户的请求,对请求进行初步的处理后,将请求放入消息队列。内部主要包含一个dispatch()方法。
    • dispathch()方法:对接收到的请求做初步处理,并且将请求数据封装成对应的消息放入消息队列。
  • Queue类:消息队列层的类,主要用于缓冲用户的请求任务,内部包含enqueue()和dequeue()两个方法。
    • enqueue():将消息放入队列。
    • dequeue():从队列获取消息。
  • SyncTask类:同步任务层的类,主要是消费队列中的消息,执行对应的业务逻辑,得出最终的结果数据,内部包含一个run()方法。
    • run()方法:执行业务逻辑,得出最终的结果数据。

# 查看全文

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码