什么是“异步 Request-Reply”模式?编程如何实现?

在某些情况下,WEB API 可能需要很长时间来处理请求,而客户端如果一直等待工作完成是不可行的,比如连接超时等。

这时,可以使用“异步 Request-Reply 模式”。

异步 Request-Reply 模式

异步 Request-Reply 模式是指:在后端处理需要是异步处理但前端仍需要明确响应的情况下,将后端处理与前端分离。

整体流程如下:

  • 客户端应用程序对业务 API 进行调用,在后端触发长时间运行的操作;

  • API 立即返回响应。返回 HTTP 202 Accepted (接受) 状态码,确认已收到请求进行处理,响应包含一个标头,包含了客户端可以轮询状态的 API 地址,以检查长时间运行的操作的结果;;

  • 客户端轮询这个状态 API,如果操作未完成,则返回 HTTP 202,否则返回 HTTP 200, 并包含实际的响应数据。

ba569c89e2cfb5ff65380498c8a9e2e5.png

下面我们来演示如何在 ASP.NET Core 中实现。

Demo

我们用等待20秒模拟一个长时间 API 操作:

[HttpGet]
[Route("get")]
public async Task<IEnumerable<WeatherForecast>> Get()
{await Task.Delay(20000);var rng = new Random();return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();
}

首先,我们创建一个新 API 操作:

[HttpGet]
[Route("async/get")]
public async Task<IActionResult> AsyncGet()
{string id = Guid.NewGuid().ToString();string responseValue = $@"/status/{id}";_cache.SetString(id, responseValue);Task.Factory.StartNew(() =>{var result = Get().Result;_cache.SetString(id + "_result", JsonConvert.SerializeObject(result));});return Accepted(responseValue);
}

具体作用就是把长时间交由 Task 执行,执行结果将放到分布式缓存中,然后立刻返回 HTTP 202 Accepted。

客户端不再访问原来的请求地址,而是使用此新地址:

26e0cb1552d4b73b99a0b9d3291e710e.png

然后,我们创建一个状态 API 用于轮询:

[HttpGet]
[Route("/status/{id}")]
public IActionResult Status(string id)
{var result = _cache.GetString(id + "_result");if (!string.IsNullOrEmpty(result)){return Ok(result);}return Accepted(_cache.GetString(id));
}

客户端根据 ID 进行轮询。

当操作还未完成时,继续返回 HTTP 202:

a242b448b7ab3cad81fd9c74b5ca63fd.png

当操作完成时,返回分布式缓存中的结果:

eaaa78396d9a98cb920b6d49a4a16f27.png

结论

如果你的 API 有长时间运行的操作,应将轮询信息尽快地返回给调用方,以便他们可以检查进度。

想了解更多内容,请关注我的个人公众号”My IO“

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

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

相关文章

【测绘程序设计】Excel度分秒(° ‘ “)转换度(°)模板附代码超实用版

在实际工作中,无论是ArcGIS中,还是CASS中,作图时需要将GPS实测的经纬度度分秒( ’ ")坐标转换为度(),在前面的文章中介绍了C#中将度分秒转为度的转换程序,本文讲解在Excel中快速度分秒( ’ ")转换度(),提高工作效率。 文章目录 准备工作编写代码注意事…

IO扩展控件(System.IO.Abstractions)

刚看到这个Namespace的时候还以为是.Net Framework里自带的包&#xff0c;结果查了一圈无任何结果。果断上Github搜索&#xff0c;一击即中 https://github.com/tathamoddie/System.IO.Abstractions先翻译下开发者给出的简单说明&#xff0c;今后再慢慢使用类似于System.Web.Ab…

[转]面向对象(1、三大特征;2、六大原则)

目录 一、面向对象的概述&#xff1a; 二、封装&#xff1a; 1、封装概述 2、封装原则 3、封装好处 4、封装坏处 5、封装代码展示 三、继承&#xff1a; 1、概念&#xff1a; 2、实现格式&#xff1a; 3、特点&#xff1a; 4、好处&#xff1a; 5、弊端&#xff1…

【测绘程序设计】C#将度分秒(° ‘ “)转换度(°)程序实现(附源码)

在实际工作中,无论是ArcGIS中,还是CASS中,作图时需要将GPS实测的经纬度度分秒( ’ ")坐标转换为度(),在前面的文章中介绍了Excel中将度分秒转为度的转换程序,本文讲解在Visual Studio中,采用C#语言实现快速度分秒( ’ ")转换度(),提高工作效率。 案例…

Spotlight监控工具使用

Spotlight on unix监控linux服务器 1.下载安装&#xff0c;工具包下载地址&#xff1a; 注&#xff1a;安装之后需要破解注册码 2.由于spotlight不能默认使用root用户登录&#xff0c;所以必须先创建一个具有root权限的用户 注&#xff1a;密码最好不要设置的过于简单化 [rootm…

Grpc MagicOnion库 之 客户端和服务端 (案例版)

之前通过自己写动态代理和用现成的动态代理库等实现过RPC功能&#xff0c;今天&#xff0c;就写一下如何直接引用GRPC的库来实现业务逻辑。gRPC的介绍&#xff0c;之前我也说了这个g的含义太多&#xff0c;也包含谷歌的意思了。可以看这个gRPC的文档介绍 : https://grpc.io/doc…

Windows11右下角出现评估副本水印如何去除?

Universal Watermark Disabler是一款十分好用的桌面工具&#xff0c;这款工具可以帮助用户轻松的去除Windows11 版本的操作系统右下角的水印。 使用方法 1、打开Universal Watermark Disabler软件&#xff0c;显示出当前系统的版本与水印状态。 2、Status中显示Ready for insta…

【GlobalMapper精品教程】001:GlobalMapper23+24 Pro-x64中文安装教程(附软件包下载)

Global Mapper 23是一款非常专业的地图绘制软件&#xff0c;功能非常的丰富&#xff0c;内置距离和面积计算&#xff0c;包括光栅混合、对比度调节、海拔高度查询、视线计算以及一些高级功能&#xff0c;可轻松实现图像校正、通过地表数据进行轮廓生成、通过地表数据观察分水岭…

JIL 编译与 AOT 编译

JIT&#xff1a;Just-in-time compilation&#xff0c;即时编译&#xff1b;AOT&#xff1a;Ahead-of-time compilation&#xff0c;事前编译。 JVM即时编译&#xff08;JIT&#xff09; 1. 动态编译与静态编译 动态编译&#xff08;dynamic compilation&#xff09;指的是“在…

中台基础指标列表

便于大家进行更方便的指标圈定&#xff0c;这里我将前面提到的通用指标进行一次拓展&#xff0c;为大家整理了一份完整的数据中台基础指标列表&#xff0c;方便大家在搭建指标体系时进行速查。 &#xff08;1&#xff09;App类产品分析指标 &#xff08;2&#xff09;网站类产…

期末作品检查

1、学期个人总结 在这个学期在杜老师的带领下学习了Python语言&#xff0c;这是一门相对于Java语言来说是比较简单的语言&#xff0c;用处也十分的广大。python是一种面向对象的解释型计算机程序设计语言&#xff0c;语法简洁清晰&#xff0c;目前已超越java成为最热门的编程语…

C# 通过不安全代码看内存加载

&#xff08;注&#xff1a;本篇用点长&#xff0c;有点绕&#xff0c;耐心浏览&#xff09;C#中类型分为值类型和引用类型&#xff0c;值类型存储在堆栈中&#xff0c;是栈结构&#xff0c;先进后出&#xff0c;引用类型存储在托管堆中。接下来用不安全代码的地址&#xff0c;…

[转]SDK与API区别

转载&#xff1a;https://www.zhihu.com/question/21691705/answer/149935191 SDK&#xff08;software development kit&#xff09;&#xff0c;中文可译为“软件开发工具包”。 一般都是一些被软件工程师用于为特定的软件包、软件架构、硬件平台、操作系统等建立应用软件的开…

详谈如何定制自己的博客园皮肤【转】

转自&#xff1a;http://www.cnblogs.com/jingmoxukong/p/7826982.html 目录 前言Quickstart定制博客园 CSS 的原理页面定制CSS代码博客侧边栏公告页首Html代码页脚Html代码定制细节独立控件小老鼠游戏动画动画时钟百度分享栏Github 角标签云背景动画动态标题文章内容样式定制带…

【ArcGIS微课1000例】0025:ArcGIS Online当前未连接到在线资源终极解决办法

ArcGIS Online在线资源列表: World Imagery: 底图服务: 中国地图彩色版: 打开ArcGIS时,系统托盘提示“ArcGIS Online当前未连接到在线资源”,如下图所示,如果无法连接到ArcGIS Online,则就无法添加在线资源,如World Imagery等。 关于该问题,网上有多种解决办法,然而…

华为笔记本Win11更新时由于驱动问题引起蓝牙鼠标经常断开问题解决方法

每次Win11升级后如果发现蓝牙鼠标经常断开&#xff0c;打开“华为电脑管家”执行以下操作即可&#xff1a; 然后更新蓝牙驱动 重启电脑OK。

【ArcGIS微课1000例】0026:ArcGIS10如何自定义工具条?

ArcGIS中,可以创建用户工具条,将自己常用的工具命令放到一起,方便实用提高工作效率。本文讲解如何自定义工具条并添加与删除工具。 1. 创建工具条 点击【自定义】菜单→【自定义模式】,如下图所示: 或者在任一工具条上点击最后面的下拉三角形→自定义: 以上两种方法都可…

基于 KubeSphere 流水线的 GitOps 最佳实践

背景Kubesphere 3.3.0 集成了 ArgoCD&#xff0c;但与笔者目前使用的 K8S 版本不兼容。再者&#xff0c;目前 Kubesphere 中持续集成和流水线打通还是不太友好&#xff0c;也缺少文档说明&#xff08;可能是笔者没有找到&#xff09;。目前遇到最主要的问题就是流水线制作完成的…

【ArcGIS微课1000例】0027:ArcGIS属性表(dbf)转Excel的4中方法

ArcGIS中的矢量数据Shapefile属性表存放在后缀名为.dbf的文件中,它是GIS数据分析的核心,如果将属性表转为别的平台使用,一般需要将其转为Excel格式。本文以ArcGIS自带矢量数据continent为例,讲解dbf转excel的常见4种方法。 文章目录 1. 表转Excel工具2. 直接打开3. 导出属性…

微信公众号自定义菜单直接跳转到小程序指定页面

首页我们要先拿到需要的小程序的页面地址&#xff1a;&#xff08;如何拿到小程序页面地址自行百度&#xff09; 然后登录公众号后台&#xff0c;添加自定义菜单&#xff1a; 菜单的路径选择“跳转小程序” &#xff0c;从绑定的小程序中选择要跳转的小程序&#xff0c;默认小程…