91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

風(fēng)控系統(tǒng)就該這么設(shè)計(jì)穩(wěn)的一批!

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-01-30 09:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

一、背景

1.為什么要做風(fēng)控?

這不得拜產(chǎn)品大佬所賜

目前我們業(yè)務(wù)有使用到非常多的AI能力,如ocr識(shí)別、語(yǔ)音測(cè)評(píng)等,這些能力往往都比較費(fèi)錢或者費(fèi)資源,所以在產(chǎn)品層面也希望我們對(duì)用戶的能力使用次數(shù)做一定的限制,因此風(fēng)控是必須的!

2.為什么要自己寫風(fēng)控?

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

要想回答這個(gè)問(wèn)題,需要先解釋下我們業(yè)務(wù)需要用到的風(fēng)控(簡(jiǎn)稱業(yè)務(wù)風(fēng)控),與開(kāi)源常見(jiàn)的風(fēng)控(簡(jiǎn)稱普通風(fēng)控)有何區(qū)別:

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

因此,直接使用開(kāi)源的普通風(fēng)控,一般情況下是無(wú)法滿足需求的

3.其它要求

支持實(shí)時(shí)調(diào)整限制

很多限制值在首次設(shè)置的時(shí)候,基本上都是拍定的一個(gè)值,后續(xù)需要調(diào)整的可能性是比較大的,因此可調(diào)整并實(shí)時(shí)生效是必須的

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

二、思路

要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的業(yè)務(wù)風(fēng)控組件,要做什么工作呢?

1.風(fēng)控規(guī)則的實(shí)現(xiàn)

a.需要實(shí)現(xiàn)的規(guī)則:

  • 自然日計(jì)數(shù)
  • 自然小時(shí)計(jì)數(shù)
  • 自然日+自然小時(shí)計(jì)數(shù)

自然日+自然小時(shí)計(jì)數(shù) 這里并不能單純地串聯(lián)兩個(gè)判斷,因?yàn)槿绻匀蝗盏呐卸ㄍㄟ^(guò),而自然小時(shí)的判定不通過(guò)的時(shí)候,需要回退,自然日跟自然小時(shí)都不能計(jì)入本次調(diào)用!

b.計(jì)數(shù)方式的選擇:

目前能想到的會(huì)有:

  • mysql+db事務(wù) 持久化、記錄可溯源、實(shí)現(xiàn)起來(lái)比較麻煩,稍微“重”了一點(diǎn)
  • redis+lua 實(shí)現(xiàn)簡(jiǎn)單,redis的可執(zhí)行l(wèi)ua腳本的特性也能滿足對(duì)“事務(wù)”的要求
  • mysql/redis+分布式事務(wù) 需要上鎖,實(shí)現(xiàn)復(fù)雜,能做到比較精確的計(jì)數(shù),也就是真正等到代碼塊執(zhí)行成功之后,再去操作計(jì)數(shù)

目前沒(méi)有很精確技術(shù)的要求,代價(jià)太大,也沒(méi)有持久化的需求,因此選用 redis+lua 即可

2.調(diào)用方式的實(shí)現(xiàn)

a.常見(jiàn)的做法 先定義一個(gè)通用的入口

//簡(jiǎn)化版代碼

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

在service中調(diào)用該方法

//簡(jiǎn)化版代碼

@Service
classOcrServiceImpl:OcrService{

@Autowired
privatelateinitvardetectManager:DetectManager

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

}

有沒(méi)有更優(yōu)雅一點(diǎn)的方法呢? 用注解可能會(huì)更好一點(diǎn)(也比較有爭(zhēng)議其實(shí),這邊先支持實(shí)現(xiàn))

由于傳入的 content 是跟業(yè)務(wù)關(guān)聯(lián)的,所以需要通過(guò)Spel來(lái)將參數(shù)構(gòu)成對(duì)應(yīng)的content

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

三、具體實(shí)現(xiàn)

1.風(fēng)控計(jì)數(shù)規(guī)則實(shí)現(xiàn)

a.自然日/自然小時(shí)

自然日/自然小時(shí)可以共用一套lua腳本,因?yàn)樗鼈冎挥?code style="font-size:14px;padding:2px 4px;margin-right:2px;margin-left:2px;color:rgb(30,107,184);background-color:rgba(27,31,35,.05);font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;">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] 是日/小時(shí)關(guān)聯(lián)的key,ARGV[1]是上限值,ARGV[2]是過(guò)期時(shí)間,返回值則是當(dāng)前計(jì)數(shù)值+1后的結(jié)果,(如果已經(jīng)達(dá)到上限,則實(shí)際上不會(huì)計(jì)數(shù))

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

//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] 是天關(guān)聯(lián)生成的key, KEYS[2] 是小時(shí)關(guān)聯(lián)生成的key,ARGV[1]是天的上限值,ARGV[2]是小時(shí)的上限值,ARGV[3]是天的過(guò)期時(shí)間,ARGV[4]是小時(shí)的過(guò)期時(shí)間,返回值同上

這里給的是比較粗糙的寫法,主要需要表達(dá)的就是,進(jìn)行兩個(gè)條件判斷時(shí),有其中一個(gè)不滿足,另一個(gè)都需要進(jìn)行回退.

2.注解的實(shí)現(xiàn)

a.定義一個(gè)@Detect注解

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

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

/**
*content的表達(dá)式
*/
valcontentSpel:String=""

)

其中content是需要經(jīng)過(guò)表達(dá)式解析出來(lái)的,所以接受的是個(gè)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!")
}
//轉(zhuǎn)換表達(dá)式
valexpression=spelExpressionParser.parseExpression(detect.contentSpel)
valargMap=joinPoint.args.mapIndexed{index,any->
"arg${index+1}"toany
}.toMap()
//構(gòu)建上下文
valcontext=StandardEvaluationContext().apply{
if(argMap.isNotEmpty())this.setVariables(argMap)
}
//拿到結(jié)果
valcontent=expression.getValue(context)

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

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

四、測(cè)試一下

1.寫法

使用注解之后的寫法:

//簡(jiǎn)化版代碼

@Service
classOcrServiceImpl:OcrService{

@Autowired
privatelateinitvardetectManager:DetectManager

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

}

2.Debug看看

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


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • AI
    AI
    +關(guān)注

    關(guān)注

    91

    文章

    39990

    瀏覽量

    301622
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    4226

    瀏覽量

    46211
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4971

    瀏覽量

    74035

原文標(biāo)題:風(fēng)控系統(tǒng)就該這么設(shè)計(jì)(萬(wàn)能通用),穩(wěn)的一批!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MEMS硅麥克風(fēng)為何能穩(wěn)坐TWS真無(wú)線立體聲耳機(jī)市場(chǎng)C位?

    麥克風(fēng),成為中高端藍(lán)牙耳機(jī)的標(biāo)配,而在國(guó)產(chǎn)替代浪潮中,華芯邦科技正憑借領(lǐng)先的技術(shù)實(shí)力,成為國(guó)內(nèi)耳機(jī)品牌的首選硅麥供應(yīng)商。 、技術(shù)革命:硅麥克風(fēng)如何顛覆傳統(tǒng)拾音方案? 硅麥克風(fēng)全稱微機(jī)
    的頭像 發(fā)表于 02-27 17:35 ?93次閱讀

    測(cè)徑儀界的“抗造擔(dān)當(dāng)”,高溫穩(wěn)測(cè),精度為王!

    構(gòu)成測(cè)量?jī)x的智能防護(hù)網(wǎng)。 高溫穩(wěn)測(cè),精度為王 目前藍(lán)鵬測(cè)控的各種測(cè)徑儀都支持產(chǎn)品定制,自主研發(fā)光電測(cè)頭采用全數(shù)字化高頻測(cè)量技術(shù),測(cè)量頻率高達(dá)2000Hz,采用CCD成像技術(shù)和物方遠(yuǎn)心光路系統(tǒng),般測(cè)徑
    發(fā)表于 12-01 15:26

    上能電氣新一批儲(chǔ)能產(chǎn)品啟程?hào)|歐市場(chǎng)

    近日,上能電氣新一批儲(chǔ)能產(chǎn)品再次裝車啟程,發(fā)往東歐各國(guó)。持續(xù)的發(fā)貨與交付正是上能電氣在東歐儲(chǔ)能市場(chǎng)加速深耕的真實(shí)寫照,也進(jìn)步鞏固了其在全球光儲(chǔ)領(lǐng)域的領(lǐng)先地位。
    的頭像 發(fā)表于 11-07 10:52 ?776次閱讀

    一批智能體開(kāi)發(fā)者的生存境況

    中國(guó)第一批智能體開(kāi)發(fā)者的生存模式,比起硅谷同行,要更復(fù)雜
    的頭像 發(fā)表于 09-05 11:29 ?3163次閱讀
    第<b class='flag-5'>一批</b>智能體開(kāi)發(fā)者的生存境況

    舜宇新獲一批車載光學(xué)鏡頭專利授權(quán)

    近日,舜宇集團(tuán)自主研發(fā)的一批車載光學(xué)鏡頭類專利獲得授權(quán)。本專利對(duì)應(yīng)的光學(xué)鏡頭通過(guò)優(yōu)化設(shè)置各透鏡的形狀、光焦度等方面,圍繞高溫穩(wěn)定性、小型化等核心特性,使車載攝像頭在 800 萬(wàn)像素及以上分辨率下仍能保持優(yōu)異的成像質(zhì)量。
    的頭像 發(fā)表于 08-06 16:06 ?1015次閱讀

    友道智途獲頒上海市新一批智能網(wǎng)聯(lián)汽車示范運(yùn)營(yíng)牌照

    2025年7月26日,中國(guó)商用車自動(dòng)駕駛發(fā)展迎來(lái)個(gè)具有分水嶺意義的時(shí)刻。在2025世界人工智能大會(huì)上,洋山港智能重卡獲頒了新一批智能網(wǎng)聯(lián)汽車示范運(yùn)營(yíng)牌照(商用領(lǐng)域全國(guó)首例),這意味著全國(guó)第一批基于法規(guī)的主駕無(wú)人的智能重卡即將商
    的頭像 發(fā)表于 07-31 15:39 ?1284次閱讀

    智己汽車獲得上海市新一批智能網(wǎng)聯(lián)汽車示范運(yùn)營(yíng)牌照

    近日,在2025世界人工智能大會(huì)(WAIC 2025)上,智己汽車與享道出行、強(qiáng)生出租組成聯(lián)合體,率先獲得上海市新一批智能網(wǎng)聯(lián)汽車示范運(yùn)營(yíng)牌照。這不僅是對(duì)智己汽車L4級(jí)自動(dòng)駕駛技術(shù)實(shí)力和安全可靠
    的頭像 發(fā)表于 07-31 15:38 ?1128次閱讀

    開(kāi)放原子開(kāi)源基金會(huì)與新一批開(kāi)源項(xiàng)目完成捐贈(zèng)簽約

    近日,在2025開(kāi)放原子開(kāi)源生態(tài)大會(huì)開(kāi)幕式上,開(kāi)放原子開(kāi)源基金會(huì)與新一批開(kāi)源項(xiàng)目完成捐贈(zèng)簽約,涵蓋人工智能、具身智能、基礎(chǔ)軟件、區(qū)塊鏈等多個(gè)技術(shù)領(lǐng)域,為基金會(huì)拓展在關(guān)鍵技術(shù)領(lǐng)域上的布局。這些項(xiàng)目豐富和完善了開(kāi)源生態(tài)核心技術(shù),構(gòu)建“工具-技術(shù)-場(chǎng)景”閉環(huán)。
    的頭像 發(fā)表于 07-28 17:04 ?1020次閱讀

    中汽中心獲多個(gè)中試驗(yàn)證平臺(tái)

    中試驗(yàn)證平臺(tái)是科技創(chuàng)新和產(chǎn)業(yè)創(chuàng)新的重要紐帶,是提高科技成果轉(zhuǎn)化效能、推動(dòng)科技創(chuàng)新和產(chǎn)業(yè)創(chuàng)新融合發(fā)展的重要載體,《中共中央關(guān)于進(jìn)步全面深化改革 推進(jìn)中國(guó)式現(xiàn)代化的決定》中明確提出“加快布局建設(shè)一批
    的頭像 發(fā)表于 07-23 16:24 ?1217次閱讀

    華興變壓器:絕緣壽命預(yù)測(cè)為何這么難?

    您在使用華興變壓器時(shí),是不是也在疑惑:三相隔離變壓器的絕緣壽命預(yù)測(cè)咋就這么難呢?這可困擾著不少企業(yè)。先看絕緣材料的個(gè)體差異。即便是同一批次生產(chǎn)的絕緣材料,由于原材料微小雜質(zhì)、生產(chǎn)時(shí)的溫度濕度波動(dòng)
    的頭像 發(fā)表于 07-11 11:24 ?513次閱讀
    華興變壓器:絕緣壽命預(yù)測(cè)為何<b class='flag-5'>這么</b>難?

    喜訊!美能光伏研發(fā)總監(jiān)-楊暢入選 2025 年第一批東吳科技領(lǐng)軍人才計(jì)劃擬立項(xiàng)名單

    ,蘇州市吳中區(qū)官方發(fā)布《關(guān)于對(duì)2025年第一批東吳科技領(lǐng)軍人才計(jì)劃擬立項(xiàng)項(xiàng)目名單的公示》,美能光伏研發(fā)總監(jiān)楊暢榮耀入選擬立項(xiàng)名單,這既是對(duì)其個(gè)人專業(yè)能力與科研貢獻(xiàn)的高度認(rèn)可,也是對(duì)美
    的頭像 發(fā)表于 07-10 09:03 ?1595次閱讀
    喜訊!美能光伏研發(fā)總監(jiān)-楊暢入選 2025 年第<b class='flag-5'>一批</b>東吳科技領(lǐng)軍人才計(jì)劃擬立項(xiàng)名單

    鐳神智能入選2025年廣東省 “機(jī)器人+” 典型應(yīng)用場(chǎng)景案例名單(第一批

    領(lǐng)導(dǎo)小組辦公室發(fā)布了《關(guān)于2025年廣東省“機(jī)器人+”典型應(yīng)用場(chǎng)景案例名單(第一批)的公示》。在此次公示中,經(jīng)過(guò)專家團(tuán)隊(duì)的嚴(yán)格評(píng)審,鐳神智能3DSLAM無(wú)人叉車智能搬運(yùn)、智能倉(cāng)儲(chǔ)物流應(yīng)用,
    的頭像 發(fā)表于 07-04 11:53 ?908次閱讀
    鐳神智能入選2025年廣東省 “機(jī)器人+” 典型應(yīng)用場(chǎng)景案例名單(第<b class='flag-5'>一批</b>)

    中科采象振動(dòng)及噪聲信號(hào)采集儀入選合肥市2025年度第一批“三新”產(chǎn)品

    近日,合肥市科技局公示了合肥市2025年度第一批新技術(shù)新產(chǎn)品新模式(“三新”)名單,中科采象自主研發(fā)的振動(dòng)及噪聲信號(hào)采集儀產(chǎn)品成功入選。合肥市新技術(shù)新產(chǎn)品新模式(簡(jiǎn)稱“三新”產(chǎn)品):是指在合肥市研發(fā)
    的頭像 發(fā)表于 07-01 09:26 ?1045次閱讀
    中科采象振動(dòng)及噪聲信號(hào)采集儀入選合肥市2025年度第<b class='flag-5'>一批</b>“三新”產(chǎn)品

    同星智能入選 “新質(zhì)企業(yè)”第一批種子企業(yè)名單

    近日,中國(guó)生產(chǎn)力促進(jìn)中心協(xié)會(huì)正式公布“新質(zhì)企業(yè)”第一批種子企業(yè)入庫(kù)名單。此次評(píng)選基于企業(yè)創(chuàng)新能力、產(chǎn)業(yè)價(jià)值、數(shù)字化能力、成長(zhǎng)性、可持續(xù)性五大核心指標(biāo),旨在培育現(xiàn)代化產(chǎn)業(yè)體系中的標(biāo)桿企業(yè),推動(dòng)新質(zhì)
    的頭像 發(fā)表于 04-03 20:03 ?731次閱讀
    同星智能入選 “新質(zhì)企業(yè)”第<b class='flag-5'>一批</b>種子企業(yè)名單

    江西薩瑞微電子榮獲2025年第一批次“數(shù)智工廠”企業(yè)稱號(hào)

    熱烈祝賀江西省工業(yè)和信息化廳正式公布2025年第一批次“數(shù)智工廠”企業(yè)名單,江西薩瑞微電子技術(shù)有限公司憑借在半導(dǎo)體集成電路領(lǐng)域的數(shù)字化創(chuàng)新與智能制造實(shí)力,成功入選。上下滑動(dòng),查看更多“數(shù)智工廠
    的頭像 發(fā)表于 03-20 11:46 ?977次閱讀
    江西薩瑞微電子榮獲2025年第<b class='flag-5'>一批</b>次“數(shù)智工廠”企業(yè)稱號(hào)