如何在应用程序启动时创建一个 Semaphoreslim 实例并在所有请求中使用同一个实例?
How to create a Semaphoreslim instance on application startup and use the same instance across all the requests?
我有一个场景,我必须将并行第 3 方 API 调用的数量限制为一次 200。为此,我使用了 SemaphoreSlim 并将可以执行代码块的线程数限制为 200。
这适用于单个 user/request。但是如果同时有多个请求呢?
SemaphoreSlim 等待和释放之间的代码块在 time/any 的任何一点是否只允许 200 个线程。请求数还是每个请求允许 200 个线程?
如果是请求,那么我如何在应用程序启动时创建一个 SemaphoreSlim 实例,以便我可以对所有请求使用同一个实例?
我不认为创建全局信号量并以这种方式干扰 ASP.NET 管理线程池的方式会很好。
快速搜索后,我找到了有关如何限制并发连接的页面,但我不熟悉它,所以这只是一个猜测:
https://www.oreilly.com/library/view/mastering-aspnet-core/9781787283688/f460937d-fa5e-439b-afa8-d0a417abc1ea.xhtml
在Program.cs中是单行加法:
如果你想限制你的请求。 Asp.net 核心有一个速率限制实现,可以在 IP 级别或资源级别进行。这将取决于您要如何配置它。这将防止对您的网络 application/api 资源
的恶意攻击
基本上你需要安装这个包
dotnet add package AspNetCoreRateLimit
在你的 ConfigureServices 上你可以做
services.RegisterLimitAndThrottlingMvcConfiguration();
这是扩展方法的实现
private static IServiceCollection RegisterLimitAndThrottlingMvcConfiguration(this IServiceCollection container,
ServiceLifetime lifeTime = ServiceLifetime.Scoped)
{
//rate limiting
//to store the counters and rules in memory
container.AddMemoryCache();
//configuring the options
container.Configure<IpRateLimitOptions>(options =>
{
options.GeneralRules = new List<RateLimitRule>
{
//any resource limit 1000 request every 5 min
new RateLimitRule
{
Endpoint = "*",
Limit = 1000,
Period = "5m"
},
//200 request every 10 seconds
new RateLimitRule()
{
Endpoint = "*",
Limit = 200,
Period = "10s"
}
};
});
container.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
container.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
return container;
}
并在 Configure
方法上设置中间件
//for limiting(header -> X-Rate-Limit- Limit, X-Rate-Limit-Remaining, X-Rate-Limit-Reset
app.UseIpRateLimiting();
关于限制你可以在这上面找一篇不错的文章linklimiting
我有一个场景,我必须将并行第 3 方 API 调用的数量限制为一次 200。为此,我使用了 SemaphoreSlim 并将可以执行代码块的线程数限制为 200。
这适用于单个 user/request。但是如果同时有多个请求呢?
SemaphoreSlim 等待和释放之间的代码块在 time/any 的任何一点是否只允许 200 个线程。请求数还是每个请求允许 200 个线程?
如果是请求,那么我如何在应用程序启动时创建一个 SemaphoreSlim 实例,以便我可以对所有请求使用同一个实例?
我不认为创建全局信号量并以这种方式干扰 ASP.NET 管理线程池的方式会很好。
快速搜索后,我找到了有关如何限制并发连接的页面,但我不熟悉它,所以这只是一个猜测: https://www.oreilly.com/library/view/mastering-aspnet-core/9781787283688/f460937d-fa5e-439b-afa8-d0a417abc1ea.xhtml
在Program.cs中是单行加法:
如果你想限制你的请求。 Asp.net 核心有一个速率限制实现,可以在 IP 级别或资源级别进行。这将取决于您要如何配置它。这将防止对您的网络 application/api 资源
的恶意攻击基本上你需要安装这个包
dotnet add package AspNetCoreRateLimit
在你的 ConfigureServices 上你可以做
services.RegisterLimitAndThrottlingMvcConfiguration();
这是扩展方法的实现
private static IServiceCollection RegisterLimitAndThrottlingMvcConfiguration(this IServiceCollection container,
ServiceLifetime lifeTime = ServiceLifetime.Scoped)
{
//rate limiting
//to store the counters and rules in memory
container.AddMemoryCache();
//configuring the options
container.Configure<IpRateLimitOptions>(options =>
{
options.GeneralRules = new List<RateLimitRule>
{
//any resource limit 1000 request every 5 min
new RateLimitRule
{
Endpoint = "*",
Limit = 1000,
Period = "5m"
},
//200 request every 10 seconds
new RateLimitRule()
{
Endpoint = "*",
Limit = 200,
Period = "10s"
}
};
});
container.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
container.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
return container;
}
并在 Configure
方法上设置中间件
//for limiting(header -> X-Rate-Limit- Limit, X-Rate-Limit-Remaining, X-Rate-Limit-Reset
app.UseIpRateLimiting();
关于限制你可以在这上面找一篇不错的文章linklimiting