什么是“异步 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…

从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)

&#xff08;73&#xff09;封装一个widget 醒目&#xff1a;必须在web环境下使用&#xff0c;无论是python的web.py或者是通过http访问网站环境&#xff0c;都可以&#xff0c;但纯本地是不可行的。 首先&#xff0c;什么是widget&#xff1f; 简单来说&#xff0c;就是一个do…

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

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

Python的MySQLdb模块安装

在配置Django时&#xff0c;选择的是mysql数据库&#xff0c;要安装MySQLdb模块&#xff0c;不过安装过程中&#xff0c;遇到了很多errors&#xff0c;记录一下。 系统:ubuntu 11.10 mysql:直接apt-get安装的&#xff0c;version:5.1.62 到官方下载MySQL for Python 然后解压&a…

【测绘程序设计】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…

redhat配置centos的yum源

redhat默认不支持第三方的yum源&#xff0c;要求有rhn账号&#xff0c;下面就rhel5和rhel6改为centos源一、rhel5.5 X86_64更改为centos的yum源查看系统自带的yum相关的rpm包rpm -qa|grep yum删掉系统自带的yum相关的包rpm -e --nodeps yum-updatesd-0 rpm -e --nodeps yum-sec…

【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;…

ArcGIS实验教程——实验四十五:坐标直接转点、线、面案例教程(Create Features From Text File)

外业实测坐标(X、Y、Z)在ArcGIS中可以方便的生成点、点自动连成线、线转面。本实验讲解ArcGIS中从数据文件创建要素工具(Create Features From Text File)生成点、线、面。 文章目录 一、工具快速入门1. 工具添加2. 工具用法二、工具使用方法1. 创建点(Point)2. 创建多点…

湖北省软件行业协会会员单位全名录(2014年的信息)

理事长单位 1.烽火通信科技股份有限公司 副理事长单位&#xff08;排名不分先后&#xff09; 2.武汉大学计算机学院 3.武汉天喻信息产业股份有限公司 4.武汉开目信息技术有限责任公司 5.武汉钢铁工程技术集团自动化有限责任公司 6.武汉菲旺软件技术有限责任公司 7.立得空间信息…

静态html引入js添加随机数后缀防止缓存

在web项目开发中&#xff0c;页面引入js被修改时&#xff0c;为避免浏览器缓存引起的问题&#xff0c;在引入js时&#xff0c;给js名后面加上随机数&#xff0c;以保证每次都发送新的请求。 在jsp中&#xff0c;一般通过后台取随机数即可&#xff0c;代码如下: <script src&…

[转]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 角标签云背景动画动态标题文章内容样式定制带…