什么是“異步 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.pswp.cn/news/284586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284586.shtml
英文地址,請注明出處:http://en.pswp.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 角標簽云背景動畫動態標題文章內容樣式定制帶…