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

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。

 

欢迎大家留言沟通 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#】 删除首/尾部字符

代码 static void Main(string[] args){string str "123abc";string strdelete "abc";string str1 str.Trim(1);string strc str1.Trim(c);string str11 str1.TrimStart(1);string strcc str1.TrimEnd(c);string strabc str.Trim(strdelete.ToCharA…

Sorting Algorithms in Python (排序算法)

本篇文章主要介绍几种经典排序算法:冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、桶排序和基数排序。并给出用python实现的算法代码。 目录 一、冒泡排序 二、快速排序 三、选择排序 四、堆排序 五、插入排序 六、希尔排序 七、归…

(非技术) 基因遗传相关知识学习笔记

目录 一、基因遗传名词解释 二、什么叫显性遗传和隐性遗传? 三、如何确定遗传性质呢?是显性还是隐性? 四、常规例子1: 五、常规例子2: 六、实际案例: 七、思考题: 八、参考: …

智慧InSAR专题———模拟数据实现现实场景异常形变点识别(项目讲解)

续上篇 文章目录 (一项技术的复现,我们应该有打破砂锅问到底的态度,我找到了这篇文章的一些灵感来源,包括算法和编程以及专业知识等,对我而言也是受益匪浅)1. 数据准备1.1 A deep learning approach to de…

MySQL选择普通索引还是唯一索引(2/16)

普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引,这两种索引的区别是: 普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询…

Android MTK 屏下指纹的调试过程记录

Demo链接 -----> https://download.csdn.net/download/u011694328/89118346 一些品牌手机都有了屏下指纹的功能,还算是个比较新颖的功能,最近有项目需要使用屏下指纹, 使用的是汇顶(Goodix)的指纹方案&#xff0c…

架构设计-订单系统之业务的设计与实现

一、背景简介 订单业务一直都是系统研发中的核心模块,订单的产生过程,与系统中的很多模块都会高度关联,比如账户体系、支付中心、运营管理等,即便单看订单本身,也足够的复杂; 业务在发展的过程中&#xff…

Go gorm库(详细版)

目录 01. 什么是ORM 02. 环境搭建 03. 连接数据库 高级设置 gorm 的命名策略 创建表 日志显示 04. 模型定义 定义一张表 自动生成表结构 修改表字段大小 字段标签 05. 单表查询 5.1 表结构 5.2 添加单条记录 5.3 批量插入 5.4 单条数据查询 5.5 根据主键查询…

Vue3学习03 pinia

Vue3学习 pinia pinia一个简单效果搭建 pinia 环境存储读取数据示例 修改数据 (三种方式)storeToRefsgetters$subscribestore组合式写法 pinia 在vue2中使用vuex,在vue3中使用pinia。 集中式状态管理,(状态数据)。多个组件共享数…

多态【C/C++复习版】

目录 一、多态是什么?如何实现? 二、 什么是重写?有什么特点? 三、什么是协变? 四、析构函数能实现多态吗?为什么要实现? 五、override和final的作用是什么? 六、 多态的原理是…

Linux下网络编程基础知识--协议

网络基础 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 协议 一组规则, 数据传输和数据的解释的规则。 比如说依次发送文件的文件名, 文件的大小, 以及实际的文件, 这样规定发送一个文件的顺序以及发送的每一个部分的格式等可以算是一种协议 型协议 …

防火墙用户管理技术——AAA

目录 一.AAA功能 (1).认证方式 (2).授权方式 (3).计费方式 二.RADUIUS协议 三.用户组织架构及管理 管理员认证登录方式 1.console 2.web 3.telnet 4.ssh 5.ftp 四.认证方式 五.AAA远程登录 1.端口添加IP地址达到互通 2.AAA视图进行配置 3.结果​编辑 一.AAA功能…

Android源码解析之截屏事件流程

今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程。用过android系统手机的同学应该都知道,一般的android手机按下音量减少键和电源按键就会触发截屏事件(国内定制机做个修改的这里就不做考虑了)。那么这里的截屏事件是如何触发的呢…

【Redis深度解析】揭秘Cluster(集群):原理、机制与实战优化

Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片与节点间通信机制,实现了水平扩展、高可用与数据容灾。本文将深入剖析Redis Cluster的工作原理、核心机制,并结合实战经验分享优化策略,为您打造坚实可靠的Redis分布式…

双数据库的安装

双MySQL的安装 【0】前言 ​ 本地已经安装过mysql5.1版本,应项目需求需要安装mysql5.7版本; ​ 官方网站下载对应版本:https://downloads.mysql.com/archives/community/ 【1】压缩包下载完成后解压至本地磁盘 【2】进入根目录下bin文件夹…

Flask基于flask_login实现登录、验证码

flask_login 是一个 Flask 扩展,用于在 Flask web 应用中实现用户会话管理。它允许你跟踪哪些用户已经登录,并管理他们的登录状态。flask_login 提供了用户认证的基础结构,但具体的用户验证(如用户名和密码检查)和存储…

泽众Testone自动化测试平台,测试用例支持单个调试执行,同步查看执行日志

泽众Testone自动化测试平台之前版本,测试用例批量和单个执行,必须要通过测试集操作执行,操作略繁琐,我们通过本轮优化升级,测试用例直接可以单个调试执行,同步查看执行日志,操作上去繁就简&…

OJ刷题日记:1、双指针(1)

目录 1、283.移动零 2、1089.复写零 3、202.快乐数 1、283.移动零 题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 …

第十届 蓝桥杯 单片机设计与开发项目 省赛

第十届 蓝桥杯 单片机设计与开发项目 省赛 输入: 频率信号输入模拟电压输入 输出(包含各种显示功能): LED显示SEG显示DAC输出 01 数码管显示问题:数据类型 bit Seg_Disp_Mode;//0-频率显示界面 1-电压显示界面 un…

电脑无法开机?原因分析与解决方案

电脑无法开机是一种常见的问题,可能会给用户带来诸多困扰。无法启动可能是由于硬件故障、软件问题或者其他未知原因引起的。在本文中,我们将介绍三种常见的方法来解决电脑无法开机的问题,以帮助用户尽快恢复正常使用。 方法1:检查…