常用性能調優策略及在風控場景下應用

来源:https://www.cnblogs.com/gugujifly/archive/2022/10/19/16805609.html
-Advertisement-
Play Games

性能調優也是有跡可尋的,本文梳理了在實際開發過程中沉澱的通用性能優化策略,並且結合風控系統服務內使用場景,幫助讀者理解性能調優相關可行策略,從而建立性能優化 SOP 概念,以後出現問題即可參照優化流程改造即可。 ...


引言

性能調優也是有跡可尋的,本文梳理了在實際開發過程中沉澱的通用性能優化策略,並且結合風控系統服務內使用場景,幫助讀者理解性能調優相關可行策略,從而建立性能優化 SOP 概念,以後出現問題即可參照優化流程改造即可。

性能優化策略

時空轉換

刷過演算法題目的都知道評分條件有:時間複雜度空間複雜度,兩樣消耗都很小的話,評分越高,即優秀的演算法。

但在實際開發過程中,一般二者不可兼得。要麼占用空間小運行時間長一點,要麼追求效率則占用空間就多一點。我們要做的就是在特定的需求場景中,極力優化其中的一方,此時往往需要犧牲另一方來達到目的。

空間換時間

在當前業務場景下,追求的是極致性能,即響應速度要足夠快,比如開屏頁的打開速度,如果每次打開 H5 都去服務端請求頁面的渲染數據,再加上用戶所在城市不同,從紐約用戶訪問北京,比北京本地用戶訪問肯定慢很多。那此時就有了 **CDN **這種工具。運營商的 CDN 節點遍佈全球,頁面在開發完畢後,直接推送到全球各地的 CDN 中緩存起來,這樣用戶訪問時只需要命中最近的 CDN 節點,速度自然而然就上去了,但是付出了空間的成本。

在風控場景內也有類似場景,決策引擎為了極致性能,也需要空間換取時間:

  • 配置數據緩存:決策流數據關聯複雜,如果每次都去和 DB 或者數據中心交互,I/O 耗時大,得不償失。本地緩存一道 + 更新觸發反而是更好的選擇。
  • 短期緩存:熱點信息且在一段時間內不會改變的(或者能容忍一段時間不變的),接入緩存會更利於查詢速度。

時間換空間

此策略反其道而行,用時間換取空間。此時,“空間比較寶貴”,比如記憶體相對於磁碟來說就很寶貴,但是存放在磁碟內再調度起來使用時,需要一定的時間來獲取。

在風控場景內,同樣存在很多場景:

  • 節省空間成本:“雲上”伺服器相對“雲下”自建 IDC 機房是更貴的空間資源,所以風控將大量非實時的數據放在雲下伺服器計算,雲上服務需要用的時候,需要付出一定的調用時間即可:跨機房調用(專線帶寬爭搶占用)需要額外多消耗 5~10 ms
  • 設備指紋採集數據壓縮上傳:風控依賴設備指紋,設備指紋是內嵌在應用 APP 內採集機器本身信息的 SDK,大量的設備信息如果不壓縮上傳會占用很多帶寬,影響占用了正常的用戶請求。壓縮後,節省了空間,但是付出的代價就是,每次都需要額外付出壓縮/解壓的耗時。

預處理/後處理

提前處理

預處理主要是為了提速。比如 CPU 和記憶體的預取操作,將記憶體中的指令和數據,提前存放到緩存中,從而加快執行的速度。

決策引擎為了保證策略的執行 RT 控制到 200ms 內,需要優化壓縮執行策略的時間,假設一個策略再怎麼優化,執行時間也是超過 200ms 的,那此時可以在上一個事件(場景)提前觸發預處理操作。

舉例:用戶發單時需要判定群組風險,但訪問群組是比較耗時,那可以在用戶進入發單前先觸發查詢群組信息並緩住,真正發單時直接讀取上次結果即可。同樣的,我們可以在用戶登錄時觸發一些操作,利於後續風控事件感知。

延後處理

不到必要時刻堅決不執行,節省成本。運用這一策略最有名的例子,就是 COW(Copy On Write,寫時複製)。假設多個線程都想操作一份數據,一般情況下,每個線程可以自己拷貝一份,放到自己的空間裡面。但是拷貝的操作很費時間。系統如果採用惰性處理,就會將拷貝的操作推遲。如果多個線程對這份數據只有讀的請求,那麼同一個數據資源是可以共用的,因為“讀”的操作不會改變這份數據。當某個線程需要修改這一數據時(寫操作),系統就將資源拷貝一份給該線程使用,允許改寫,這樣就不會影響別的線程。

延後操作在風控中主要為了節省成本,決策引擎為了極致的性能,很多變數(或者叫特征/指標)都是一次性並行載入的,但此時有的變數是第三方收費指標,比如 IP、同盾、蟻盾等,預載入的好處顯而易見,但是也極大的增加了成本:用戶有可能還未走到付費變數決策節點時就被拒或者白名單直接通過,此時這部分用戶提前請求三方就是極大的浪費。只有真正走到付費策略時,才會去請求,此時成本最小。

並行/非同步操作

並行

一個人乾不完的活,那就多找幾個人一起乾!並行操作,處理效率高(前提是機器多核心),時間大大縮短,極大縮短了 RT 時間。絕大多數互聯網伺服器,要麼使用多進程,要麼使用多線程來處理用戶的請求,以充分利用多核 CPU。另外一種情況就是在有 IO 阻塞的地方,也是非常適合使用多線程並行操作的,因為這種情況 CPU 基本上是空閑狀態,多線程可以讓 CPU 多乾點活。

決策引擎如果執行策略都是同步執行的話,幾分鐘可能都執行不完,運用並行,充分發揮 CPU 多個核心的性能,那麼此時性能瓶頸就是最長的那塊木板,只要專攻優化它就好了。

非同步

非同步相對同步來說,就是是否等待結果還是立即返回。同步操作在碰到內部有大量 I/O 操作時,性能損耗極大,此時採用非同步操作,系統的吞吐行會有極大的提升。但是有利有弊,非同步操作也增加了程式的複雜度,需要考慮失敗補償等額外的操作。

此類場景在風控系統中也是隨處可見:

  • MQ 消息:天然的非同步處理,依托於消息消費機制削峰填谷特性,在大耗時操作動作,且業務不需要同步返回情況下,非常適合用消息來處理,比如離線決策。
  • 埋點、監控採樣:不在業務關心的流程內發起的操作,為了不影響 RT,需要將額外的操作非同步處理。

緩存/批量合併

數據緩存

緩存的目的就是為了加速,這個我們從學習程式語言開始就基本達成的共識,基本上各個系統內只要有性能考慮的,多少都會用到緩存。我們常用的一些工具,也穿插了緩存的影子,比如:

  • IOC 控制反轉:不僅僅是依賴註入,同時也節省了創建 bean 的時間
  • 線程池中活躍線程:池化概念目的是增速,池本身就是一個緩存容器,頻繁的創建池內對象,得不償失,此時固定一批在池內,用完即還,極大的避免了創建新對象的開銷。

批量合併處理

批操作一般是遇到 I/O 操作時才會使用,一次性儘量多的查詢到多的數據,減少網路耗時時間(註意,這不是絕對,思考一下為何需要分頁,在時間和空間找平衡)。

常見批操作如下:

  • 資料庫查詢批處理:在處理多條數據時一次性 in 查詢出來,避免頻繁的單條迴圈查詢
  • redis 掃描數據:可以使用 scan 類命令,而不是頻繁的 get (註:會造成 redis hold 住,需要平衡 key 的個數)

總結

性能調優可以有多種手段,有時從不同的角度,能發揮奇效,當然前提是得在業務可接受的成本內,不考慮實際是不切實際的。

如上介紹的性能調優策略,這些是在日常開發過程中總結思考沉澱的,希望能夠幫助讀者建立一個性能優化 SOP,能有通用的摸排手段,做到用時心中有數。

往期精彩

歡迎關註公眾號:咕咕雞技術專欄
個人技術博客:https://jifuwei.github.io/

參考:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 本文來源:社區原創投稿;作者:王慶勛。 客戶的一些應用系統使用的JDK1.7版本,在將資料庫遷移到MySQL8.0的過程中,發現有些MySQL conn ...
  • 作為游戲類App的用戶運營,難免會遇到以下問題: 競品競爭激烈,新用戶獲取成本很高,該如何有效輓回卸載用戶和沉默用戶? 預算有限,該對哪些人群做活動才能獲得較高的ROI呢? 如何根據用戶屬性和用戶行為劃分用戶價值層級,並精準觸達呢? 如今,高昂的買量成本讓游戲的吸量越發艱難,存量用戶的精細化運營成為 ...
  • 本文主要記錄學習 Vue.js 的核心技術,涵蓋常用指令、計算屬性、監聽屬性、數據監測原理、生命周期鉤子等。 ...
  • 前言 ​ 在實際中,一個CAD文件中往往存放多張圖紙,有時需要這些圖紙分開,單獨保存或顯示。以往的做法是在cad中人工進行處理。今天小編教您在web端一鍵把CAD圖自動分割成多張圖紙並能把每個子圖導出成單獨的dwg文件或保存成圖片。 例如要處理的CAD原圖為: 自動識別所有子圖的結果為(所有子圖的範 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 本篇文章主要探討盒模型,以及內邊距、邊框、外邊距的面試題與思考,也希望您能把您的思考和遇到的問題以評論的方式補充下,後期,我將會補充到文章中 第一問:什麼是盒模型? 可以說,頁面就是由一個個盒模型堆砌起來的,每個HTML元素都可以叫做盒模 ...
  • 組件類 拖拽 | 名稱 | Vue | 描述 | | : : | :-: | | | sortable.js | | | | Draggable | 2 | 基於並提供 Sortable.js 的所有功能 | | Draggable | 3 | 基於並提供 Sortable.js 的所有功能 | 二 ...
  • 要瞭解記憶體泄漏與記憶體溢出,首先需要瞭解記憶體是怎麼分配的,故此,本文將按照以下幾節闡述: 記憶體管理 垃圾回收· 記憶體泄漏 記憶體管理 JavaScript 是在創建變數(對象,字元串等)時自動進行了分配記憶體,並且在不使用它們時“自動”釋放。釋放的過程稱為垃圾回收。這個“自動”是混亂的根源,並讓 Java ...
  • 在 事件迴圈 期間的某個時刻,運行時會從最先進入隊列的消息開始處理隊列中的消息。被處理的消息會被移出隊列,並作為輸入參數來調用與之關聯的函數。正如前面所提到的,調用一個函數總是會為其創造一個新的棧幀。函數的處理會一直進行到執行棧再次為空為止;然後事件迴圈將會處理隊列中的下一個消息(如果還有的話)。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...