記一個并發規則驗證實現

最近在做一個簡單的風控,其中有一塊需求是這樣的,當主請求參數到達后,會根據這些參數,看調起幾個并發規則,這些規則各自有自己的驗證邏輯,每個規則執行時間長短都不確定,當規則 執行完后,返回主請求,主請求根據規則驗證返回結果,從而決定是否立即response請求,但其他后到的規則 ,要繼續完成后面驗證,以得到驗證結果,以備后用。

初步的.net代碼是這樣實現的:

using System.Threading.Channels;var builder = WebApplication.CreateBuilder(args);var app = builder.Build();app.MapGet("/test", async () =>
{Console.WriteLine($"開始時間 {DateTime.Now.ToString("HH:mm:ss")}");var channels = new List<Channel<Parameter>>();var len = 5;//創建Channel,并關聯ReadAsync方法for (int i = 0; i < len; i++){var channel = Channel.CreateUnbounded<Parameter>(new UnboundedChannelOptions() { AllowSynchronousContinuations = true });channels.Add(channel);await Task.Factory.StartNew(async () =>{Console.WriteLine($"Task {i}");await ReadAsync(channel);});}//向Channel發送信息for (int i = 0; i < channels.Count; i++){var channel = channels[i];await channel.Writer.WriteAsync(new Parameter { I = i });Console.WriteLine($"Write {i}");}//讀取返回Channel,如果有返回True,API提前返回,留下的Channel給RemainingReadAsync執行for (int i = 0; i < channels.Count; i++){var channel = channels[i];if (channel != null && await channel.Reader.WaitToReadAsync()){if (channel.Reader.TryRead(out var par)){if(par.Result){Console.ForegroundColor = ConsoleColor.Green;}Console.WriteLine($"I:{par.I},Result:{par.Result},{DateTime.Now.ToString("HH:mm:ss")}");Console.ResetColor();if (par.Result){//把剩會的推到一個線程中執行for (var r = i + 1; r < channels.Count; r++){await Task.Factory.StartNew(async () =>{await RemainingReadAsync(channels[r]);});}return TypedResults.Ok($"完成,有,{DateTime.Now.ToString("HH:mm:ss")}");}}}}return TypedResults.Ok($"完成,沒有,{DateTime.Now.ToString("HH:mm:ss")}");
});app.Run();
//處理剩余Channelr方法
async Task RemainingReadAsync(Channel<Parameter> channel)
{if (channel != null && await channel.Reader.WaitToReadAsync()){if (channel.Reader.TryRead(out var par)){Console.WriteLine($"I:{par.I},Result:{par.Result},{DateTime.Now.ToString("HH:mm:ss")}");}}
}
//讀取Channel的方法
async Task ReadAsync(Channel<Parameter> channel)
{if (channel != null && await channel.Reader.WaitToReadAsync()){if (channel.Reader.TryRead(out var par)){await Task.Delay((par.I + 1) * 1000);if (par.I == 2){par.Result = true;}else{par.Result = false;}await channel.Writer.WriteAsync(par);}}
}//參數
class Parameter
{public int I { get; set; }public bool Result { get; set; }
}

下圖是執行結果,當五個任務并發調起后,并發寫入數據,執行中,第三個滿足條件,于21:59:13返回請求,但后續的兩個,依然保證完成。

f1c2cd3449c0b415643dc29bed7c8cd8.png

這個Demo只是簡單的完成了邏輯,關于性能還有待進一步測試驗證改進。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EIGRP個人學習筆記

【理論部分】1、EIGRP的主要特征&#xff1a;①Cisco專有協議(高級dv路由)&#xff1b;②支持VLSM; ③觸發、增量更新&#xff1b;---------減少帶寬的占用④支持多層網絡協議ApplleTalk,IP 和 Novell Netware等協議&#xff1b;⑤收斂速度快&#xff1b;----------采用dual算法…

C語言試題153之判斷一個素數能被幾個 9 整除

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:判斷一個素數能被幾個 9 整除…

[轉]Zookeeper入門看這篇就夠了

Zookeeper是什么 官方文檔上這么解釋zookeeper&#xff0c;它是一個分布式服務框架&#xff0c;是Apache Hadoop 的一個子項目&#xff0c;它主要是用來解決分布式應用中經常遇到的一些數據管理問題&#xff0c;如&#xff1a;統一命名服務、狀態同步服務、集群管理、分布式應用…

微服務-springcloud(eureka實踐, nacos實踐)

Spring 體系圖 版本關系 eureka 實踐 1 父工程依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.14</version> </parent> <dependencyManage…

Windows服務二:測試新建的服務、調試Windows服務

一、測試Windows服務 為了使Windows服務程序能夠正常運行&#xff0c;我們需要像創建一般應用程序那樣為它創建一個程序的入口點。像其他應用程序一樣&#xff0c;Windows服務也是在Program.cs的Main()函數中完成這個操作。首先我們在Main&#xff08;&#xff09;函數中創建一…

角度前方交會點坐標計算完整步驟

測量工作中&#xff0c;我們常常會遇到待測點被障礙物遮擋住觀測視線而無法進行觀測的情況。這時候我們就需要特殊的交會計算方法對待定點進行特別的觀測。 前方交會又稱為測角交會&#xff0c;是指從相鄰兩個已知點向待定點觀測兩個水平角&#xff0c;用以計算待定點的坐標。 …

Mysql 的子查詢

子查詢&#xff1a; 子查詢&#xff1a;嵌套在其它查詢中的查詢語句。&#xff08;又稱為內部查詢&#xff09; 主查詢&#xff1a;包含其它子查詢的查詢稱為主查詢。&#xff08;又稱外部查詢&#xff09; 非相關子查詢&#xff1a; 在主查詢中&#xff0c;子查詢只需要執行一…

【系統設計】指標監控和告警系統

在本文中&#xff0c;我們將探討如何設計一個可擴展的指標監控和告警系統。一個好的監控和告警系統&#xff0c;對基礎設施的可觀察性&#xff0c;高可用性&#xff0c;可靠性方面發揮著關鍵作用。下圖顯示了市面上一些流行的指標監控和告警服務。接下來&#xff0c;我們會設計…

C語言試題154之兩個字符串連接程序

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:兩個字符串連接程序 2 、溫馨…

[轉]Android studio 快速解決Gradle's dependency cache may be corrupt 和 Gradle配置 gradle

用了好久的AS了&#xff0c;官方版本更新&#xff0c;各種配置工具 也跟著更新。更新后導入工程時&#xff08;使用Android工程編譯或者導入新的工程沒有對應的gradle版本&#xff09;一些電腦出現一下問題。 Error:Failed to open zip file. Gradles dependency cache may …

mybatis源碼學習

2019獨角獸企業重金招聘Python工程師標準>>> 學習主線&#xff1a; 目的&#xff1a;mybatis的作用orm框架&#xff0c;用了該框架就不用自己調用jdbc了。 用法&#xff1a;。。。。。 邏輯&#xff1a;。。。。。 源代碼&#xff1a;。。。。。 1、猜想mybatis對數…

自己封裝一個彈框插件

彈出層提示信息&#xff0c;這是移動前端開發中最常見的需求&#xff0c;你可能會想到一些流行的彈框插件&#xff0c;比如 經典的artDialog 炫酷的Sweetalert等等.. 但是慢慢地你其實會發現通常情況下需求定制化要求較高&#xff0c;一般的彈框插件可能只滿足大部分要求&#…

C語言中include““與include<>的區別(自定義頭文件、預設頭文件)

文章目錄 新建控制臺應用程序自定義頭文件編輯頭文件工程內引用頭文件,調用函數標準庫頭文件,調用函數新建控制臺應用程序 Win32 Application和Win32 Console Application 都是工作在32位Windows環境的程序。其中: (1)Win32 Application就是普通的常見的窗口應用程序,當…

.NET MAUI 性能提升

點擊藍字關注我們作者&#xff1a;Jonathan Peppers翻譯&#xff1a;Yijing Sun校稿&#xff1a;Amy Peng排版&#xff1a;Rani Sun精彩預告*本文干貨滿滿&#xff0c;預計閱讀時間32分鐘&#xff0c;建議收藏保存。.NET多平臺應用程序UI (MAUI)將android、iOS、macOS和Windows…

類與類之間的關系

橫向關系依賴 關聯 聚合 組合 判斷方法&#xff1a; 生命周期有關系&#xff1a;組合&#xff0c;聚合  聚合&#xff1a;包含多個相同的類  組合&#xff1a;定義的時候就要有  依賴&#xff1a;只要使用就必須要有  關聯&#xff1a;可有可無 縱向關系繼承 基類( 父類…

C語言試題155之有五個學生,每個學生有 3 門課的成績,從鍵盤輸入以上數據(包括學生號,姓名,三門課成績),計算出 平均成績,況原有的數據和計算出的平均分數存放在磁盤文件“stud“中

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有五個學生,每個學生有 3 門…

仿照支付寶賬單界面--listview分組顯示 用來做!發!財樹充值交易明細

QQ圖片20150430155638.png (151.65 KB, 下載次數: 32) 下載鏈接: http://pan.baidu.com/s/1kVMY1SV 密碼: i8ta

系統中常用的目錄

Linux系統中常用的目錄 目錄 /bin 存放二進制可執行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在這里。 /etc 存放系統管理和配置文件 /home 存放所有用戶文件的根目錄&#xff0c;是用戶主目錄的基點&#xff0c;比如用戶user的主目錄就是/home/user&#xff0…

C語言試題156之有兩個磁盤文件 A 和 B,各存放一行字母,要求把這兩個文件中的信息合并(按字母順序排列), 輸出到一個新文件 C 中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有兩個磁盤文件 A 和 B,各存…