極驗高併發驗證服務背後的技術實現

来源:http://www.cnblogs.com/lyf83/archive/2016/04/01/5345616.html
-Advertisement-
Play Games

極驗目前的用戶超過7萬家網站,日均驗證量1億次,作為一家專註於驗證安全服務的公司,極驗所要面臨的併發壓力主要表現在以下幾點: 日益增加的用戶併發量。 驗證請求是全動態過程,不能夠進行緩存。 每一次請求都會造成資料庫的讀寫。 處理請求需要耗費CPU大量的時間進行模型的計算。 作為抗擊黑產的第一線,可能 ...


極驗目前的用戶超過7萬家網站,日均驗證量1億次,作為一家專註於驗證安全服務的公司,極驗所要面臨的併發壓力主要表現在以下幾點:
  1. 日益增加的用戶併發量。
  1. 驗證請求是全動態過程,不能夠進行緩存。
  1. 每一次請求都會造成資料庫的讀寫。
  1. 處理請求需要耗費CPU大量的時間進行模型的計算。
  1. 作為抗擊黑產的第一線,可能遭到黑產的攻擊。
那麼極驗是如何做到,既保證用戶的驗證需求量,又儘量快速響應用戶的驗證請求,還能夠扛得住黑產的攻擊呢?極驗主要從三個方面來解決高併發問題。 降低併發的開銷 利用協程處理併發,我們熟知的協程相較於線程來說具有的優點是,能夠跨平臺跨體系架構,不需要線程上下文切換和原子操作鎖定及同步的開銷。這樣就避免了操作系統調度線程造成的資源浪費。同時協程方便切換控制流,能夠簡化編程模型,避免非同步回調代碼的邏輯分割,使得程式的可讀性好,有利於後臺的維護。像極驗這樣高併發量同時需要高擴展性的驗證服務企業來說,使用協程處理是降低併發開銷最合適的方法。
  • 代碼示例
其次極驗利用OpenResty過濾非法請求,以及限制不同賬戶併發。OpenResty 是一個基於 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了比較精良的 Lua 庫、第三方模塊以及大多數的依賴項。能夠比較便捷地搭建處理超高併發、高擴展性的動態 Web 服務。 提升資料庫性能 極驗主要通過兩個手段來提升資料庫的性能:驗證的臨時數據採用基於分散式Redis和構建嵌入式資料庫緩存,實現資料庫零查詢。 Proxy的Redis存儲可能是目前比較常規的存儲方法,通過代理將讀寫壓力進行合理分配。codis-proxy基於GO和C語言,併發處理能力比較強。後端基於slot概念支持靈活,還具有對用戶透明的擴容和縮容操作,簡單便捷,集群管理工具豐富等優勢。 但是對於極驗來說這樣的方式並不是那麼合適,存在著以下幾點極驗必須要考慮的問題。
  1. 使用代理使得整個結構多了一層不安全因素,一旦代理層出現問題,那麼後面的都無法正常運轉。
  1. 代理本身並不具備良好的擴展性,無法自動的進行分配,在運維上有一定的難度。
  1. 加入代理層也會使得整個結構的響應速度相應減慢。
考慮到這些問題,我們選擇採用自己的基於客戶端的分散式解決方案,結構如下。 客戶端通過一致性hash,寫入當前機器與hash環上的下一臺機器,實現數據冗餘。讀取時從當前機器讀取,失敗則從hash環上下一臺機器讀取。得益於相對簡單的結構,擴容、故障恢復速度會快得多,同時運維成本更低。 在高併發量的情況下,資料庫往往成為瓶頸,加上大量掛起等待的協程也會使得資料庫的性能大大降低。像極驗這樣每天有大量的驗證數據需要讀取,提升資料庫性能就顯得十分重要。我們的解決方案是進行嵌入式緩存,所有查詢完全遵循緩存中的數據,緩存定期與資料庫同步。同時緩存直接嵌入服務進程內,實現幾乎零開銷查詢。由於Python的GIL存在,我們利用mmap實現進程間共用記憶體。 我們在實現這個嵌入式緩存的過程中,完全按照我們業務中遇到的實際問題進行設計,所以可能對於其他業務不是很適用。具體來說,極驗的資料庫查詢主要有三種特性:1.數據幾乎只讀不寫,並且對於數據一致性要求不高。2.資料庫查詢開銷相對計算邏輯比重較大。3.介面併發數長期保持在較高水平,用傳統緩存方式的話一旦緩存被穿透(例如惡意偽造不存在的數據)系統將崩潰。基於上面三點特性,我們專門定製了最適合我們自己的緩存,並使得資料庫完全不再是系統的瓶頸。 提高計算性能 提高計算性能極驗主要採用以下兩種方式: 主要性能消耗在數據處理邏輯以及神經網路參數計算
  • 利用Cython將計算密集代碼編譯成擴展模塊供Python調用
   
  • 控制神經網路規模,同時優化計算效率
通過不斷調整神經網路的參數和加大訓練的迭代次數來保證足夠精度下網路規模最小。 在預測時加入DropOut,讓部分神經元不參與計算,減少計算量的同時一定程度避免過擬合。 利用小網路學習大網路所提取到的特征加上現代Cpu的SIMD指令集加速計算——使用優化過的Blas庫例如OpenBlas等。這樣一來,能夠很好的控制神經網路的規模。 極驗通過以上三個技術手段,來解決高併發問題。目前我們使用不到二十臺阿裡雲伺服器的情況下可以做到5w的併發,並且整個架構可以完全快速橫向擴展。

 


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

-Advertisement-
Play Games
更多相關文章
  • 這個對象池相當小巧,支持加鎖以方便支持線程安全,當然了,如果在單線程中使用,可以指定一個偽鎖。 這個對象池並不能解決記憶體碎片問題,只是用空間換時間。這個代碼相當簡短,一看就明白,所以不寫用例了。還有這個鎖的代碼就不貼了,因為鎖的樣式各有不同,還有避免跑題,避免喧賓奪主。 上代碼: 不夠150字不允許 ...
  • JAVA Quick Java 8 or Java 7 Dev Environments With Docker Printing arrays by hacking the JVM Mobile How to Create a News Reader With React Native: Web ... ...
  • 數量 時間限制:200 ms | 記憶體限制:65535 KB 難度:0 HJS大牛想去街上吃飯,街道旁邊拴著很多狗,他想我堂堂......(省略n個字)豈會被狗咬,所以他很牛的從狗的面前經過,不管是否被上一條狗咬過,下次還會從狗的面前過(J I A N) 現在問題來了,我們給狗編號從1...n,有多 ...
  • 這個星期接到一個新的任務:解決HQ(一個用JAVA開發的開源的運維監控平臺)現在遇到的snmp升級到3.0後bug。公司用的HQ是4.6版本。於是,我把項目從gitlab上clone下來後,就開始了我的填坑之旅。坑了幾天坑,到目前,正常情況,應該只有最後一個坑了,應該是關於tomcat運行環境的。閑 ...
  • 安裝python3.5可能使用的依賴 到python官網找到下載路徑, 用wget下載 解壓tgz包 把python移到/usr/local下麵 刪除舊版本的python依賴 進入python目錄 配置 編譯 make 編譯,安裝 刪除舊的軟鏈接,創建新的軟鏈接到最新的python Enjoy yo ...
  • 頭文件 my_sql.h 實現文件 my_sql.cpp 調用實例 main.cpp ...
  • Atitit.eclipse git使用 1. Git vs svn1 1.1. 直接記錄快照,而非差異比較1 1.2. Git的patch則不依附於branch,commit和commit之間的關係是一個GRAPH3 1.3. hg 本地有更改的時候,可以直接 pull 遠程代碼,然後在自己當前更 ...
  • 首先,我不是一個開發者,只是業餘學習者。其次我的文化水平很低,寫這個主要是記錄一下當前對於這塊的理解,因為對於一個低水平 的業餘學習者來說,忘記是很平常的事,因為接觸、應用的少,現在理解,可能過段時間就會忘了,自己記錄下來應該可以少走些彎路,以免從頭再來查找資料。 另外,如果我的記錄能幫忙到一些朋友 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...