在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

風控系統就該這么設計穩的一批!

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-01-30 09:32 ? 次閱讀

12ab472e-a03d-11ed-bfe3-dac502259ad0.jpg

一、背景

1.為什么要做風控?

這不得拜產品大佬所賜

目前我們業務有使用到非常多的AI能力,如ocr識別、語音測評等,這些能力往往都比較費錢或者費資源,所以在產品層面也希望我們對用戶的能力使用次數做一定的限制,因此風控是必須的!

2.為什么要自己寫風控?

那么多開源的風控組件,為什么還要寫呢?是不是想重復發明輪子呀.12d2b32c-a03d-11ed-bfe3-dac502259ad0.jpg

要想回答這個問題,需要先解釋下我們業務需要用到的風控(簡稱業務風控),與開源常見的風控(簡稱普通風控)有何區別:

12dbbc42-a03d-11ed-bfe3-dac502259ad0.png

因此,直接使用開源的普通風控,一般情況下是無法滿足需求的

3.其它要求

支持實時調整限制

很多限制值在首次設置的時候,基本上都是拍定的一個值,后續需要調整的可能性是比較大的,因此可調整并實時生效是必須的

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

二、思路

要實現一個簡單的業務風控組件,要做什么工作呢?

1.風控規則的實現

a.需要實現的規則:

  • 自然日計數
  • 自然小時計數
  • 自然日+自然小時計數

自然日+自然小時計數 這里并不能單純地串聯兩個判斷,因為如果自然日的判定通過,而自然小時的判定不通過的時候,需要回退,自然日跟自然小時都不能計入本次調用!

b.計數方式的選擇:

目前能想到的會有:

  • mysql+db事務 持久化、記錄可溯源、實現起來比較麻煩,稍微“重”了一點
  • redis+lua 實現簡單,redis的可執行lua腳本的特性也能滿足對“事務”的要求
  • mysql/redis+分布式事務 需要上鎖,實現復雜,能做到比較精確的計數,也就是真正等到代碼塊執行成功之后,再去操作計數

目前沒有很精確技術的要求,代價太大,也沒有持久化的需求,因此選用 redis+lua 即可

2.調用方式的實現

a.常見的做法 先定義一個通用的入口

//簡化版代碼

@Component
classDetectManager{
funmatchExceptionally(eventId:String,content:String){
//調用規則匹配
valrt=ruleService.match(eventId,content)
if(!rt){
throwBaseException(ErrorCode.OPERATION_TOO_FREQUENT)
}
}
}

在service中調用該方法

//簡化版代碼

@Service
classOcrServiceImpl:OcrService{

@Autowired
privatelateinitvardetectManager:DetectManager

/**
*提交ocr任務
*需要根據用戶id來做次數限制
*/
overridefunsubmitOcrTask(userId:String,imageUrl:String):String{
detectManager.matchExceptionally("ocr",userId)
//doocr
}

}

有沒有更優雅一點的方法呢? 用注解可能會更好一點(也比較有爭議其實,這邊先支持實現)

由于傳入的 content 是跟業務關聯的,所以需要通過Spel來將參數構成對應的content

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

三、具體實現

1.風控計數規則實現

a.自然日/自然小時

自然日/自然小時可以共用一套lua腳本,因為它們只有key不同,腳本如下:

//lua腳本
localcurrentValue=redis.call('get',KEYS[1]);
ifcurrentValue~=falsethen
iftonumber(currentValue)tonumber(ARGV[1])then
returnredis.call('INCR',KEYS[1]);
else
returntonumber(currentValue)+1;
end;
else
redis.call('set',KEYS[1],1,'px',ARGV[2]);
return1;
end;

其中 KEYS[1] 是日/小時關聯的key,ARGV[1]是上限值,ARGV[2]是過期時間,返回值則是當前計數值+1后的結果,(如果已經達到上限,則實際上不會計數)

b.自然日+自然小時 如前文提到的,兩個的結合實際上并不是單純的拼湊,需要處理回退邏輯

//lua腳本
localdayValue=0;
localhourValue=0;
localdayPass=true;
localhourPass=true;
localdayCurrentValue=redis.call('get',KEYS[1]);
ifdayCurrentValue~=falsethen
iftonumber(dayCurrentValue)tonumber(ARGV[1])then
dayValue=redis.call('INCR',KEYS[1]);
else
dayPass=false;
dayValue=tonumber(dayCurrentValue)+1;
end;
else
redis.call('set',KEYS[1],1,'px',ARGV[3]);
dayValue=1;
end;

localhourCurrentValue=redis.call('get',KEYS[2]);
ifhourCurrentValue~=falsethen
iftonumber(hourCurrentValue)tonumber(ARGV[2])then
hourValue=redis.call('INCR',KEYS[2]);
else
hourPass=false;
hourValue=tonumber(hourCurrentValue)+1;
end;
else
redis.call('set',KEYS[2],1,'px',ARGV[4]);
hourValue=1;
end;

if(notdayPass)andhourPassthen
hourValue=redis.call('DECR',KEYS[2]);
end;

ifdayPassand(nothourPass)then
dayValue=redis.call('DECR',KEYS[1]);
end;

localpair={};
pair[1]=dayValue;
pair[2]=hourValue;
returnpair;

其中 KEYS[1] 是天關聯生成的key, KEYS[2] 是小時關聯生成的key,ARGV[1]是天的上限值,ARGV[2]是小時的上限值,ARGV[3]是天的過期時間,ARGV[4]是小時的過期時間,返回值同上

這里給的是比較粗糙的寫法,主要需要表達的就是,進行兩個條件判斷時,有其中一個不滿足,另一個都需要進行回退.

2.注解的實現

a.定義一個@Detect注解

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION,AnnotationTarget.CLASS)
annotationclassDetect(

/**
*事件id
*/
valeventId:String="",

/**
*content的表達式
*/
valcontentSpel:String=""

)

其中content是需要經過表達式解析出來的,所以接受的是個String

b.定義@Detect注解的處理類

@Aspect
@Component
classDetectHandler{

privatevallogger=LoggerFactory.getLogger(javaClass)

@Autowired
privatelateinitvardetectManager:DetectManager

@Resource(name="detectSpelExpressionParser")
privatelateinitvarspelExpressionParser:SpelExpressionParser

@Bean(name=["detectSpelExpressionParser"])
fundetectSpelExpressionParser():SpelExpressionParser{
returnSpelExpressionParser()
}

@Around(value="@annotation(detect)")
funoperatorAnnotation(joinPoint:ProceedingJoinPoint,detect:Detect):Any?{
if(detect.eventId.isBlank()||detect.contentSpel.isBlank()){
throwillegalArgumentExp("@Detectconfigisnotavailable!")
}
//轉換表達式
valexpression=spelExpressionParser.parseExpression(detect.contentSpel)
valargMap=joinPoint.args.mapIndexed{index,any->
"arg${index+1}"toany
}.toMap()
//構建上下文
valcontext=StandardEvaluationContext().apply{
if(argMap.isNotEmpty())this.setVariables(argMap)
}
//拿到結果
valcontent=expression.getValue(context)

detectManager.matchExceptionally(detect.eventId,content)
returnjoinPoint.proceed()
}
}

需要將參數放入到上下文中,并起名為arg1、arg2....

四、測試一下

1.寫法

使用注解之后的寫法:

//簡化版代碼

@Service
classOcrServiceImpl:OcrService{

@Autowired
privatelateinitvardetectManager:DetectManager

/**
*提交ocr任務
*需要根據用戶id來做次數限制
*/
@Detect(eventId="ocr",contentSpel="#arg1")
overridefunsubmitOcrTask(userId:String,imageUrl:String):String{
//doocr
}

}

2.Debug看看

12e43304-a03d-11ed-bfe3-dac502259ad0.jpg
  • 注解值獲取成功
  • 表達式解析成功


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • AI
    AI
    +關注

    關注

    87

    文章

    31711

    瀏覽量

    270511
  • 開源
    +關注

    關注

    3

    文章

    3412

    瀏覽量

    42744
  • 代碼
    +關注

    關注

    30

    文章

    4837

    瀏覽量

    69129

原文標題:風控系統就該這么設計(萬能通用),穩的一批!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    達實智能入選深圳市第一批全屋智能建筑應用試點項目

    近期,深圳市住房和建設局公布了《深圳市第一批全屋智能建筑應用試點項目清單》,達實智能大廈憑借在空間場景及物聯網平臺的應用入選清單,成為首批9個項目之。
    的頭像 發表于 02-07 09:29 ?225次閱讀

    手機和鋰電池納入第一批工業產品碳足跡核算規則團體標準推薦清單

    了《工業產品碳足跡核算規則團體標準推薦清單(第一批)》(以下簡稱《清單》)。手機和鋰電池作為重要的電子產品及其關鍵組件,其碳排放量對全球氣候變化具有重要影響,因此
    的頭像 發表于 01-21 17:47 ?536次閱讀
    手機和鋰電池納入第<b class='flag-5'>一批</b>工業產品碳足跡核算規則團體標準推薦清單

    十堰新一批智慧路燈投用,集多種功能于身 智慧路燈案例分享

    十堰新一批智慧路燈投用,集多種功能于身 智慧路燈案例分享
    的頭像 發表于 01-03 10:39 ?124次閱讀
    十堰新<b class='flag-5'>一批</b>智慧路燈投用,集多種功能于<b class='flag-5'>一</b>身 智慧路燈案例分享

    win系統處顯示當時的時間日期

    win系統處顯示當時的時間日期
    發表于 12-30 08:53

    芯來科技入選上海市新輪第一批重點“小巨人”企業

    )等文件規定,上海市新輪第一批重點“小巨人”企業實施期初獎補資金分配方案正式公布。芯來科技憑借在RISC-V領域的專業化實力與示范作用成功入選上海市新輪第一批重點“小巨人”企業。
    的頭像 發表于 12-19 15:38 ?259次閱讀

    本人研,做DFB激光頻,目前只差FPGA ADC DAC做個反饋系統

    我目前要做的是DFB激光器的頻。目前差個數字電路的系統,我打算用FPGA來實現。要求:個ADC(內置或者外接的模塊)八通道以上,來
    發表于 12-01 21:48

    總投資超60億元,一批半導體相關項目簽約江蘇宜興

    近日,宜興經開區開放創新合作大會在宜興陶都半島酒店舉行。一批重要載體現場揭牌,一大批重磅項目集中簽約,為建設國際化現代化流園區注入新的動能。
    的頭像 發表于 10-24 17:49 ?452次閱讀

    國電西高成功交貨一批高壓電氣設備檢測儀器

    近日,北京電建公司、桂林成套廠和山東電力服務公司采購國電西高一批高壓電氣設備檢測儀器。經過生產部門的努力和質檢團隊的嚴格把關,所有訂單均順利完成,并及時發貨。
    的頭像 發表于 10-11 10:46 ?328次閱讀

    羅萊迪思入選2024年第一批浙江省制造業單項冠軍培育企業!

    8月23日,浙江省經濟和信息化廳公布了2024年第一批浙江省制造業單項冠軍培育企業名單,根據《關于開展2024年浙江省制造業單項冠軍培育企業遴選入庫工作的通知》要求,經企業自主申報、各地推薦審核、省廳復審復查,杭州羅萊迪思科技股份有限公司成功入選該名單。
    的頭像 發表于 09-04 15:05 ?476次閱讀
    羅萊迪思入選2024年第<b class='flag-5'>一批</b>浙江省制造業單項冠軍培育企業!

    首都氫能示范跑出加速度!新一批50臺蘇州金龍氫能大巴上線北京

    ,北京大興國際氫能示范區再次迎來新一批50臺氫能客車投入運營,為京津冀氫能示范城市群注入科技創新力量,彰顯首都踐行“雙碳”目標的責任擔當與技術引領。而這些車輛全部為蘇州金龍12米氫燃料電池客車。車輛搭載玉柴興順達商用車燃料
    的頭像 發表于 05-14 10:38 ?378次閱讀
    首都氫能示范跑出加速度!新<b class='flag-5'>一批</b>50臺蘇州金龍氫能大巴上線北京

    太極半導體入選第一批蘇州市“3A級綠色工廠”名單

    近日,蘇州市工信局公示了第一批蘇州市“3A級綠色工廠”名單,太極半導體(蘇州)有限公司(以下簡稱:太極半導體)成功入選。
    的頭像 發表于 03-27 16:11 ?762次閱讀
    太極半導體入選第<b class='flag-5'>一批</b>蘇州市“3A級綠色工廠”名單

    華工高理開發出車用溫度傳感器、壓力傳感器等一批“專精特新”產品

    2月28日,孝感華工高理電子有限公司新能源汽車PTC熱管理系統擴能基地,一批PTC加熱器有序下線。
    的頭像 發表于 03-11 09:30 ?864次閱讀

    科技日報重點報道:量子科技有望催生一批未來產業先導區

    轉自科技日報科技日報記者 原稿標題: 量子科技有望催生一批未來產業先導區 ? ? 量子科技是重大顛覆性創新的潛在領域,已成為新輪科技革命與產業變革的國際前沿焦點。 令代表委員振奮的是,今年
    的頭像 發表于 03-07 08:21 ?309次閱讀
    科技日報重點報道:量子科技有望催生<b class='flag-5'>一批</b>未來產業先導區

    思嵐科技通過2024年第一批上海市高新技術成果轉化項目認定

    近日,2024年第一批擬認定上海市高新技術成果轉化項目名單予以公示通過。
    的頭像 發表于 02-28 15:41 ?554次閱讀
    思嵐科技通過2024年第<b class='flag-5'>一批</b>上海市高新技術成果轉化項目認定

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發版的硬件I2C驅動如何做到穩得一批

    個評論中,看到網友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩得一批。
    的頭像 發表于 02-23 09:37 ?2912次閱讀
    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發版的硬件I2C驅動如何做到穩得<b class='flag-5'>一批</b>
    主站蜘蛛池模板: 午夜看片网址 | 日本大片网| 天天干天天干天天操 | 免费看三级黄色片 | 国产三级国产精品 | 国产一级特黄 | 午夜影院欧美 | 九月婷婷亚洲综合在线 | 女人的天堂网站 | 欧美黄色一级视频 | 波多野结衣50连精喷在线 | 国产三级在线免费 | 六月婷婷综合 | 国产免费卡1卡2卡 | 国产va在线 | 99久久免费中文字幕精品 | 高h肉肉视频在线播放观看 高黄视频 | 99久久久久国产精品免费 | 国产又黄又爽又猛的免费视频播放 | 激情综合五月网 | 美女网站黄页 | 午夜精品久久久久久久第一页 | 新版天堂资源在线官网8 | 亚洲伊人99综合网 | 亚洲香蕉久久一区二区三区四区 | 鲁久久 | 天堂网www在线资源链接 | 丁香六月婷婷在线 | 美女很黄很黄是免费的·无遮挡网站 | 全部在线播放免费毛片 | 狼色网| 男人的天堂97 | 在线免费视频观看 | xxxxxx日本人免费 | 五月丁香啪啪 | 又黑又长黑人欧美三级 | 亚洲综合五月天欧美 | 天天做夜夜操 | 乱e伦有声小说 | 高清视频在线观看+免费 | 天堂网在线看 |