记一个并发规则验证实现

最近在做一个简单的风控,其中有一块需求是这样的,当主请求参数到达后,会根据这些参数,看调起几个并发规则,这些规则各自有自己的验证逻辑,每个规则执行时间长短都不确定,当规则 执行完后,返回主请求,主请求根据规则验证返回结果,从而决定是否立即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.mzph.cn/news/285190.shtml

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

相关文章

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;一般的弹框插件可能只满足大部分要求&#…

.NET MAUI 性能提升

点击蓝字关注我们作者&#xff1a;Jonathan Peppers翻译&#xff1a;Yijing Sun校稿&#xff1a;Amy Peng排版&#xff1a;Rani Sun精彩预告*本文干货满满&#xff0c;预计阅读时间32分钟&#xff0c;建议收藏保存。.NET多平台应用程序UI (MAUI)将android、iOS、macOS和Windows…

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

C语言试题156之有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件 C 中。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:有两个磁盘文件 A 和 B,各存…

【ArcGIS微课1000例】0002:创建渔网(Create fishnet)

本文讲解ArcGIS软件中渔网(fishnet)工具的原理,方法及使用技巧。 文章目录 微课目标工具介绍实现过程微课目标 如下图所示,影像为无人机航测生产的DOM,现在需要在ArcGIS平台中进行DLG数据采集(数字化),由于测区较大,需要创建500*500的渔网,并对影像进行裁剪下发给多…

使用 Scrutor 快速实现“装饰者模式”

装饰者模式介绍装饰器模式&#xff08;Decorator Pattern&#xff09;是在不改变原类和使用继承的情况下&#xff0c;动态地给一个对象添加一些额外的职责。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。可以在如下使用场景中使用装饰器模式&#xff1a;在…

C语言试题157之从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。 输入的字符串以!结束

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:从键盘输入一个字符串,将小…

【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp

用过CASS的人都知道&#xff0c;野外数字测图得到的点数据&#xff08;平面坐标&#xff09;可以直接在CASS中展点&#xff0c;进一步绘制地形图。那么&#xff0c;带有坐标的数据能不能在ArcGIS中实现点图层的生成呢&#xff1f;答案是必须的&#xff01; 本文以气象台站Excel…