云架构(四)异步请求-应答模式

Asynchronous Request-Reply pattern - Azure Architecture Center | Microsoft Learn

把后台处理和前端解耦,后台处理需要异步处理,但是也需要给前端一个清晰的回应。

背景和问题 

  1. 在现代应用开发中,代码通常在浏览器中运行,依赖于远程API接口提供的业务逻辑和功能。这些API直接与应用程序有关,或者是第三方提供的共享服务。通常这些API调用通过HTTP(S)协议调用,并且遵循REST语义。
  2. 大多情况下,客户端应用程序的API被设计为快速响应,100ms甚至更少。许多因素会造成响应延迟,包括:
    1. 应用的主机堆栈
    2. 安全组件
    3. 调用者和后台的相对物理位置
    4. 网络基础设施
    5. 当前负荷
    6. 请求有效负荷大小
    7. 处理队列长度
    8. 后台处理时间
  3. 任何一个因素都可以增加系统延迟。有一些可以通过扩展后台来缓解。其他的例如网络设施,已经超出了应用程序开发者的控制。大部分API可以很快的响应,以便通过同一连接返回。程序代码可以通过非阻塞的方式制作一个异步API请求,提供异步处理外观,这被推荐在IO操作上使用。
  4. 有时候,后台完成需要很长时间运行,在秒级之上,甚至可能需要执行几分钟或者几个小时。这种情况下,让请求等待完成响应是不可行的。这是任何同步请求-应答模式的潜在问题。
  5. 一些架构解决这个问题通过使用消息中间件来分开请求和响应阶段。这种分离通常使用Queue-Based Load Leveling pattern实现。这种分离可以允许客户端进程和后台API独立扩展。但是这种分离也带来了额外的复杂性,当客户端需要成功的通知,这一步需要是异步的。
  6. 针对客户机应用程序讨论的许多相同注意事项,也适用于分布式系统中的服务器到服务器REST API调用,例如,在微服务体系结构中。

解决办法 

  1. 这个问题的一个思路是使用HTTP轮询,轮询是在客户端代码使用,因为很难提供回调端点或使用长时间运行的连接。尽管回调可能能做到,但是需要额外的库和服务有时也会增加额外的复杂性。
    1. 客户端程序调用一个同步请求API,触发了后台上长时间运行的操作。
    2. API同步尽可能的快速响应。返回一个HTTP202(已接收)的状态码,确认这个请求已经被接收处理。
      1. 在开始长时间运行操作前,API应该校验请求和执行动作。如果请求是无效的,立即回应错误代码例如HTTP400(错误请求)。
    3. 响应持有本地引用指向终端,所以客户端可以轮询检查长时间运行操作的结果。
    4. API将处理工作转移给另一个组件,比如消息队列。
    5. 对于每个成功请求,状态终端会返回HTPP200。当工作还在待处理时,状态终端返回一个资源,表明工作还在处理中。一旦工作完成,状态终端要么返回一个表明完成的资源,要么跳转去另一个资源URL。例如,如果异步操作创建了一个新资源,状态终端会跳转到该资源的URL。
  2. 下面的图表展示了一个典型的流程:

 问题和考虑

  1. 有许多可能的方法可以通过HTTP实现此模式,但并不是所有的上游服务都具有相同的语义。例如,当远程请求尚未完成时,大多数服务不会从GET方法返回HTTP 202响应。遵循纯REST语义,它们应该返回HTTP 404(未找到)。当您考虑到调用的结果尚未出现时,此响应是有意义的。
  2. HTTP 202响应应该指明客户端应该轮询响应的位置和频率。它应该有以下额外的响应头:
    1. Location : 客户端应该轮询响应状态的URL。
    2. Retry-After:对处理完成时间的估计。
  3. 根据所使用的底层服务,您可能需要使用处理代理或facade来操作响应头或有效负载。
  4. 如果状态端点在完成时重定向,则HTTP 302或HTTP 303是适当的返回码,具体取决于您支持的确切语义。
  5. 成功处理后,Location标头指定的资源应该返回适当的HTTP响应代码,例如200 (OK)、201(创建)或204(无内容)。
  6. 如果在处理过程中发生错误,将错误保存在Location标头中描述的资源URL中,并理想地从该资源向客户端返回适当的响应代码(4xx代码)。
  7. 并不是所有的解决方案都以同样的方式实现这个模式,有些服务将包含额外的或备用的头。例如,Azure资源管理器使用此模式的修改版本。详情查看:https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/async-operations。
  8. 历史客户端不一定支持这个模式。在这种情况下,您可能需要在异步API上放置一个facade,以便对原始客户机隐藏异步处理。例如,Azure逻辑应用程序原生支持这种模式,可以用作异步API和进行同步调用的客户端之间的集成层。详情查看:https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-create-api-app#perform-long-running-tasks-with-the-webhook-action-pattern。
  9. 在有些场景下,你可能想要提供一个客户端可以取消长时间运行请求的方式。这样的话,后台服务必须支持某种形式的取消指令。

什么时候使用 

  1. 客户端代码(例如浏览器应用)这些难以提供回调的终端,或者使用长连接增加了很多的额外的复杂性。
  2. 只允许HTTP协议调用服务,并且因为客户端的防火墙限制导致服务不可以回调。
  3. 服务调用需要适配不支持回调技术的遗留架构,例如WebSockets or webhooks。

不适用 

  1. 你可以使用为异步通知构建的服务,例如Azure Event Grid。
  2. 响应必须实时返回给客户端。
  3. 客户端需要收集很多结果,这些结果的接收延迟很重要。可以考虑使用服务总线模式。
  4. 网络设计允许你开启端口来接收异步回调或webhook。

 

欢迎大家留言沟通 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/538892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS实战开发-录音机、如何实现音频录制和播放的功能

介绍 本示例使用audio相关接口实现音频录制和播放的功能,使用mediaLibrary实现音频文件的管理。 相关概念: AudioRecorder:音频录制的主要工作是捕获音频信号,完成音频编码并保存到文件中,帮助开发者轻松实现音频录…

麒麟 V10 离线 安装 k8s 和kuboard

目录 安装文件准备 主机准备 主机配置 修改主机名(三个节点分别执行) 配置hosts(所有节点) 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包(所有节点) 系统参数设置(所有节点) 时间同步…

【Qt】界面优化

目录 一、QSS 1.1 基本语法 1.2 QSS设置方法 1.2.1 指定控件样式设置 1.2.2 全局样式设置 1.2.3 从文件加载样式表 1.2.4 使用Qt Designer编辑样式 1.3 选择器 1.3.1 介绍 1.3.2 子控件选择器 1.3.3 伪类选择器 1.4 样式属性(盒模型) 1.5 代码示例(登录界面) 二、…

html中的“居中”问题详解(超全)

html中的“居中”问题详解(超全) 图片居中文本居中定位居中元素居中响应式设计中的居中技巧 引言: 在网页设计和开发中,实现元素的居中是一个常见但也常被低估的挑战。无论是在传统的网页布局中还是在响应式设计中,居中…

DP10RF001一款工作于200MHz~960MHz低功耗、高性能、单片集成的(G)FSK/OOK无线收发芯片

产品概述. DP10RF001是一款工作于200MHz~960MHz范围内的低功耗、高性能、单片集成的(G)FSK/OOK无线收发机芯片。内部集成完整的射频接收机、射频发射机、频率综合器、调制解调器,只需配备简单、低成本的外围器件就可以获得良好的收发性能。芯片支持灵活可设的数据包…

MySQL之sql性能分析

sql执行频率 MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的所有INSERT、DELETE、UPDATE、SELECT的访问频次。 慢日志查询 慢查询日志记录了所有执行时间超过指定参数(longquer…

AR地图导览小程序是怎么开发出来的?

在移动互联网时代,AR技术的发展为地图导览提供了全新的可能性。AR地图导览小程序结合了虚拟现实技术和地图导航功能,为用户提供了更加沉浸式、直观的导览体验。本文将从专业性和思考深度两个方面,探讨AR地图导览小程序的开发方案。 编辑搜图 …

MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。

本篇文章主要讲解MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。通过本篇文章你可以快速掌握brew安装相对应环境的能力。 作者:任聪聪 日期:2024年4月12日 一、brew介绍及安装说明 官网地址:https://b…

工具推荐:市面上有哪些AI智能客服机器人比较好用?

在这个客户期望得到即时响应的时代,AI智能客服机器人成为了许多企业提高客户满意度和效率的重要工具。这些机器人利用最新的人工智能技术,可以24/7无休止地回答客户的查询,处理常见问题,甚至在必要时将问题转接给真人客服。接下来…

大数据架构之关系型数据仓库——解读大数据架构(二)

文章目录 前言什么是关系型数仓对数仓的错误认识与使用自上而下的方法关系型数仓的优点关系型数仓的缺点数据加载加载数据的频率如何确定变更数据 关系型数仓会消失吗总结 前言 本文对关系型数据仓库(RDW)进行了简要的介绍说明,包括什么是关…

50. QT/QML中创建多线程的方式汇总

1. 说明 在QT / QML中创建线程主要有三种方式。第一种:在定义类时继承 QThread 这个类,然后重写父类的虚函数 run(),将子线程需要执行的业务代码放到 run() 函数当中即可。**注意:**这种方式官方已经摒弃了。第二种:使用moveToThread()函数将需要在子线程中执行的函数类移…

OOCT WPF_D3D项目报错无法加载依赖项

运行示例项目报错缺少dll,发现运用了这个大老李,通过添加PATH路径也无法解决,看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项,图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…

Java基于微信小程序的高校体育场管理小程序,附源码

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

数据结构(图)

定义 G (V, E) 图 (点,边) 图,Graph 点,Vertex 边,edge 有空表,空树,但没有空图 图可以没有边|E| 0,但不能没有一个点 稠密图 &稀疏图 是边的多少决定的 (见Ex…

npm 切换成淘宝源,以及遇到npm 报错如何解决

淘宝源:npm config set registryhttps://registry.npmmirror.com/ 然后再npm下 package-lock.json这个删了 npm i再试一下

清远某国企IBM服务器Board故障上门维修

接到一台来自广东清远市清城区某水利大坝国企单位报修一台IBM System x3650 M4服务器无法开机的故障,分享给大家,同时也方便有需要的朋友能及时找到我们快速解决服务器问题。 故障服务器型号:IBM System x3650 M4 服务器使用单位:…

每日两题 / 142. 环形链表 II 146. LRU 缓存(LeetCode热题100)

142. 环形链表 II - 力扣(LeetCode) 用哈希记录走过的节点即可 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:Lis…

Swift Zulian Tiger

Swift Zulian Tiger 迅捷祖利安猛虎 16万金(游戏币) 1万金大概就能兑换460元~600元之间,6400元-9600元,汗颜 故事的一天刚打完BWL,才125金(游戏币) 本来想下线的结果他们说你太黑了&…

智能售货机:引领便捷生活

智能售货机:引领便捷生活 在这个科技迅速进步的时代,便捷已成为生活的必需。智能售货机作为技术与便利完美结合的产物,正逐渐改变我们的购物方式,为都市生活增添新的活力。 智能售货机的主要优势是它的极致便利性。不论是在地铁…

GMSSL-通信

死磕GMSSL通信-C/C++系列(一) 最近再做国密通信的项目开发,以为国密也就简单的集成一个库就可以完事了,没想到能有这么多坑。遂写下文章,避免重复踩坑。以下国密通信的坑有以下场景 1、使用GMSSL guanzhi/GmSSL进行通信 2、使用加密套件SM2-WITH-SMS4-SM3 使用心得 ​…