首页 新闻 搜索 专区 学院

net core 接口重复请求处理

0
[待解决问题]

我使用jme 进行测试, 接口在很短暂的时间来提交
他们的时间间隔是

2021:07:19 :12:23:52 4500123
2021:07:19 :12:23:52 4500124

千分之1秒级别的请求, 请问, 我如何在控制器,利用缓存来最小改动的处理这个问题?

我不舔了的主页 我不舔了 | 小虾三级 | 园豆:1196
提问于:2021-07-19 12:26
< >
分享
所有回答(3)
0

这种应该可以通过中间件(AOP)拦截处理,参考这篇文章

《面试必问之AOP(面向切面编程)》

戎"码"一生 | 园豆:864 (小虾三级) | 2021-07-19 12:38

aop 我已经做了现在了,

但是它用多个线程, 1秒内请求,aop 拦截不了,还是有漏网之鱼

支持(0) 反对(0) 我不舔了 | 园豆:1196 (小虾三级) | 2021-07-19 18:23
0

场景信息描述清楚,
这个接口是做什么业务的, 重复和不重复有什么影响, 你想要达到的效果, 你的服务部署情况(单机,集群), TPS等.

就单说重复请求的解决在不同的情况下有不同的解决方案.
例如进程内加锁, 通过redis实现分布式锁等

czd890 | 园豆:11904 (专家六级) | 2021-07-19 12:58

这不用关我什么业务吧?
这是单体架构
我想从控制器层入手,尽可能的不用redis 处理,

支持(0) 反对(0) 我不舔了 | 园豆:1196 (小虾三级) | 2021-07-19 18:21

@Cgrain:

这是你自己打印的时间把, 和限流组件用的时间不一定一样的.
官方的组件已经保证了请求计数的原子性, 自然也不是你说的什么多线程的问题.
代码可以参考
https://github.com/stefanprodan/AspNetCoreRateLimit/blob/d95385e534656dc8bad276637e51cb2e9bc40f44/src/AspNetCoreRateLimit/Core/ProcessingStrategies/AsyncKeyLockProcessingStrategy.cs#L33
AsyncLock.WriterLockAsync 保证了对单个拦截策略的原子性的读取和写入.

真正的问题在于:
if (entry.Value.Timestamp + rule.PeriodTimespan.Value >= DateTime.UtcNow)

 var counter = new RateLimitCounter
            {
                Timestamp = DateTime.UtcNow,
                Count = 1
            };

生成的timestamp不会是整秒的 , 比如限流 00:00:01.05 到00:00:02.05, 如果请求在是00:00:02.05和00:00:02.06 到达. 它们在同一秒, 你认为它应该限流, 其他它不会限流.

另外在多嘴一句, 通常限流业务不会要求精准的计数. 用户的call只要差不多就OK. 比如限流1000, call到1010问题不大.

所以我才问你的业务是什么, 服务部署情况等, 脱离了环境和业务谈技术就有点耍流氓了.

支持(0) 反对(0) czd890 | 园豆:11904 (专家六级) | 2021-07-19 20:03
0

你是要限流,还是要处理并发问题?

吴瑞祥 | 园豆:29187 (高人七级) | 2021-07-21 12:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册