第
使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力
使用场景是需要使用一个接口,这个接口有限制每个APIKey的请求量在5次/s
一开始是最苯的做法,每次调用之后等个200毫秒,这样就不会超出这个限制
但是这样效率也太低了,刚好发现我们拥有不少APIKey,那么直接改成并发的吧,安排!
本文做一个简单的记录
将每个APIKey的调用情况保存在内存里
C#提供的MemoryCache组件是个key-value结构,并且可以设置每个值的过期时间
我把APIKey作为key存入,value则是已使用的次数,并设置过期时间为1秒
这样只需要判断某个APIKey的使用次数是否小于5,小于5就拿来用,大于5就读取配置拿新一个的APIKey。
使用fluent-console
fluent-console是我之前开发的C#Console应用模板,提供「现代化的控制台应用的开发体验」脚手架,能像Web应用那样很优雅地整合各种组件,包括依赖注入、配置、日志等功能。
项目地址:/Deali-Axy/fluent-dotnet-console
本文需要用到MemoryCache等组件,用这个模板会比较方便,首先使用这个模板创建一个项目
#安装模板
dotnetnewinstallFluentConsole.Templates
创建项目
dotnetnewflu-cli-nMyProject
准备配置文件
在配置文件里准备好APIKeys
编辑项目的appsettings.json
Logging:{
LogLevel:{
Default:Debug
AppSettings:{
Name:Thenameofthisappisfluentconsoledemo,
Boolean:true,
DemoList:[
item1,
item2,
item3
ApiKeys:[
apikey-xxx,
apikey-xxx,
apikey-xxx,
apikey-xxx,
apikey-xxx,
apikey-xxx,
apikey-xxx,
apikey-xxx
fluent-console模板已经处理好了配置相关的逻辑,后续直接使用即可
编辑Program.cs文件
添加需要的服务
services.AddMemoryCache();
services.AddScopedApiService
等下来ApiService里写代码
ApiService
在Services文件夹下创建ApiService.cs文件
先把依赖注入进来
usingFlurl;
usingFlurl.Http;
usingMicrosoft.Extensions.Caching.Memory;
usingMicrosoft.Extensions.Logging;
usingMicrosoft.Extensions.Options;
namespaceMyProject.Services;
publicclassApiService{
privatereadonlyILoggerApiService_logger;
privatereadonlyAppSettings_settings;
privatereadonlyIMemoryCache_cache;
publicApiService(IOptionsAppSettingsappOptions,IMemoryCachecache,ILoggerApiServicelogger){
_cache=cache;
_logger=logger;
_settings=appOptions.Value;
封装keys管理
这里写了一个方法来获取一个可用的APIKey
因为需要考虑并发运行,对_cache对象加锁
思路很简单上面已经介绍了,直接写成代码,同时写了很清楚的注释
privatestringGetNextApiKey(){
lock(_cache){
foreach(var