電商項目_秒殺_架構及核心

秒殺架構設計

?先看下普通web項目架構:?

(Nginx : 反向代理、負載均衡,一般是運維部分做生產搭建的時候配置好)

秒殺架構設計:

和普通架構區別:

  • 原先由Web 服務或Nginx服務提供的靜態資源放到了CDN
  • Nginx的職責放?,前置?來做Web ?關,承擔部分業務邏輯校驗,并且可能增加??名單、限流和流控的功能

秒殺技術選型

核?設計是對巨?的瞬間流量進?層層錯峰

錯峰1:頁面靜態化。將包含瀏覽者信息的動態數據和不包含的靜態數據進行區分。

錯峰2:秒殺前答題。?的是防?機器刷單,以及錯開?戶的下單時?。

錯峰3:Redis扣減庫存。快速扣減庫存, 扣減庫存完通知nginx.

錯峰4:Nginx快速通知秒殺結束。

錯峰5:MQ進行流量消峰

錯峰6:引? MQ 進?下單服務異步化

秒殺后端鏈路圖

—場完整的秒殺活動的?概流程是這樣的:

1.運營?員在秒殺系統的運營后臺,根據指定商品,創建秒殺活動,指定活動的開始時間、結束時間、活動庫存等。

2.活動開始之前,由秒殺系統運營后臺開啟秒殺,會同時往商城系統的Redis Cluster集群寫? ??秒殺活動信息 和往秒殺系統的Redis主從集群寫諸如 秒殺商品庫存 等信息。

3.?戶進?到秒殺商詳?準備秒殺。

4.商品詳情?可以看到?即搶購的按鈕,這?我們可以通過增加?些邏輯判斷來限制按鈕是否可以點擊,?如是否設置了搶購?戶等級限制,是否還有活動庫存,是否設置了預約等等。如果都沒限制,?戶可以點擊搶購按鈕,進?到秒殺結算?。

5.在結算?,?戶可更改購買數量,切換地址、?付?式等,這?的結算元素也需要按實際業務來定,更復雜的場景還可以?持積分、優惠券、紅包、配送時效等,并且這些都會影響最終價格的計算。

6.確認?誤后,?戶提交訂單,在這?后端服務可以調??控、限購等接?,來完善校驗,都通過之后,完成庫存的扣減和訂單的?成。

7.訂單完成后,根據?戶選擇的?付?式跳轉到對應的??,?如在線?付就跳轉到收銀臺,貨到付款的話,就跳到下單成功提示?。

相關技術點:

  • 秒殺活動開始:Canal組件監聽DB里秒殺活動變化,同步到Redis,并在首頁展示
  • 商品詳情頁:Nginx配置了詳情頁的頁面,動態數據從Redis中獲取, 靜態數據在Nginx中配置好
  • 確認訂單:
  • 生成訂單:Redis中扣減庫存

秒殺前流量管控

秒殺中的流量管控

1. 流量削峰

  1. 驗證碼和回答問題:有兩個?的,?是快速攔截掉部分刷?流量,防?機器作弊,起到防刷的作?;?是平滑秒殺的?刺請求,延緩并發,對流量進?削峰。
  2. 消息調用:用到兩個業務系統之間的調用中

2. 限流

Nginx限流

Nginx本身也提供了?常強?的限流功能,?如有兩個專?的限流模塊HttpLimitzone和HttpLimitReqest

  1. HttpLimitzone?來限制?個客戶端的并發連接數,
  2. HttpLimitReqest通過漏桶算法來限制?戶的連接頻率
// HttpLimitzone示例
// 表示同?ip不同請求地址,進?名為one的zone,限制速率為1請求/秒。http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location /search/ {limit_req zone=one burst=2 nodelay;}}
}

應用/服務層限流

1. 線程池:限制連接數

2. 限流組件:QPS的限流

3. 自定義限流:

????????比如用戶的下訂單請求,前端在用戶進入訂單結算頁面時,調用訂單號服務生成個orderId,在用戶提交訂單時,帶著這個orderId.?

????????訂單號的獲取,秒殺場景下的改進是:JVM緩存放置預先生成的orderId, 定時任務定時去生成新的orderId并放入緩存中(注意保證線程安全)。

????????JVM緩存中的訂單號起到限流的作用, 同時前端提前生成orderId, 也防止了同一個訂單提交多次。

分層過濾

舉個例子,秒殺如果商品售罄,會將庫存為0的結果寫到nginx緩存

1. nginx判斷庫存, 先判斷本地緩存, 在判斷redis緩存, 結果為0時終止秒殺

2. 業務鏈路中,同樣都會做庫存的判斷

業務上還要解決退單導致庫存量增加,思路:訂閱對應的Redis的channel.

3. 限購

限購的策略:

  • 商品維度:秒殺產品的總量、商品發貨地 等等
  • 個人維度:1個手機號1單、1人1天1單 等等

秒殺活動時, 流量先經過限流策略過濾后,在進入到訂單服務。通過限購策略,也可以過濾到一部分流向訂單系統的流量。

庫存扣減

庫存扣減涉及到兩個核心操作,查商品庫存,庫存充足扣減庫存。要保證其原子性

1. 數據庫

1. 查詢和扣減放在一個事務中

2. where 條件保證庫存 >= 0

3. 樂觀鎖, 先查詢,更新時帶著版本號

4. 數據庫特性:無符號整數字段,值不能小于0, 所以扣減到小于0,SQL報錯(性能超,不適合秒殺,適合業務量小的場景)

2. 分布式鎖

商品維度加分布式鎖,但不適合秒殺場景。

  • 過期時間的設置,太短,業務流程未走完就過期了;太長,如果當前業務流程異常,導致其他線程一直阻塞鎖,性能不高。
  • 秒殺場景,商品還串行下單,性能肯定不好

3. 高并發扣減

降級

降級?般是有損的,那么必然要有所犧牲,?種常?的降級:寫服務降級、讀服務降級。

1. 寫服務降級:犧牲數據─致性獲取更?的性能。 降級手段,同步寫數據庫降級成同步寫緩存、異步寫數據庫

Redis扣減庫存,通過lua腳本,保證查詢和扣減原子性的執行

2. 讀服務降級:故障場景下緊急降級快速?損。

????????在做?可?系統設計時,要牢記就是微服務?身所依賴的外部中間件服務或者其他RPC服務,隨時都可能發?故障,因此我們需要建設多級緩存,以便故障時能及時降級?損。

????????假設當秒殺的Redis緩存出現故障時,我們就可以通過降級開關,快速將讀請求降級到 從Redis 緩存、MongoDB或者ES上。或者當Redis和備份緩存同時出現故障時(現實中很少出現同時故障的場景),我們還是可以通過降級開關將流量切換到數據庫上,讓數據庫暫時承壓來完成讀請求服務。

簡化系統設計

????????簡化系統功能就是指?掉?些不必要的流程,舍棄?核?功能。

????????商品的基本信息外,還有很多附加的信息,?如你是否收藏過該商品、商品的收藏總數量、商品的排?榜、評價和推薦等樓層。同樣,對于秒殺結算?,還會有禮品卡、優惠券等虛擬?付路徑。

????????不過,實際運?中,這種?核?功能的有損降級,要視具體的SKU?定,?般為了降低影響范圍,我們只對流量?常?的SKU進?降級。?如,如果是?機秒殺,?般是不需要降級的,但是像?罩這樣的爆品,就需要針對SKU維度進??核?功能的降級了。

????????降級開關的怎么設計呢,其實?較簡單,核?思路就是通過配置中?,對降級開關進?變更,然后推送到各個微服務實例上。

4. 熱點數據

?????????般?并發的常規解決思路是:數據庫通過分庫分表來應對;Redis,增加Redis集群的分?來解決,?應?層?般是?狀態的設計。所以從數據庫、Redis緩存到應?服務,都是可以通過增加機器來?平擴展服務能?,解決?并發的問題。

? ? ? ? 但是秒殺場景,就那么幾個商品,這些手段顯然不夠。

1. 讀熱點

1. 增加熱點數據的副本數。?增加Redis從的副本數,然后業務層(Tomcat集群)輪詢查詢不同的副本,提?同?數據的QPS。

2. 讓熱點數據離?戶越近越好。

  • 把熱點數據再上移, 在服務內部做熱點數據的本地緩存。但是本地緩存的數據延遲要有解決方案
  • 如果還是用redis緩存,nginx和nginx需要的緩存部署在一起,業務服務和業務服務使用的緩存部署在一起, 做到不跨網絡訪問。

3. 直接短路訪問。 要具體業務具體分析, 根據商品的配置,直接不走一些業務邏輯。

2. 寫熱點

  1. 預約人數場景, 實際展示的預約人數并不要求十分精確, 對應的解決方式:先在JVM內存?累加,延遲提交到 Redis,這樣就可以把 Redis 的OPS降低??倍。
  2. 寫對象顆粒化,庫存的扣減場景,可以通過把?個熱 key拆解成多個key的?式,避免熱點問題。
  3. 單SKU的庫存直接在Redis 單分?上進?扣減。實際上,扣減庫存在秒殺鏈路的末端,通過之前的削峰和限流的各種?段,真正到庫存的流量是有限的,單?的Redis OPS 能承受得了。然后,我們可以針對單SKU的庫存扣減進?單獨限流,保證庫存單?Redis的壓?。這樣雙管?下,單SKU的庫存Redis 扣減壓?就是可控的了。

相關技術

OpenResty

????????Nginx在主要的秒殺系統設計中,扮演著?常重要的??,意味著Nginx上要承載很多的業務邏輯。Nginx的底層模塊?般都是?C語?寫的,如果我們想在Nginx的基礎之上寫業務邏輯會很不?便,所以這個時候我們還得借助OpenResty,它是Nginx的?個社區分?。

????????按照官?的說法,OpenResty 是?個基于 Nginx 與 Lua 的?性能 Web 平臺,其內部集成了?量精良的 Lua庫、第三?模塊以及?多數的依賴項。?于?便地搭建能夠處理超?并發、擴展性極?的動態 Web 應?、Web 服務和動態?關。

????????OpenResty本質上是將 LuaJIT 的虛擬機嵌?到 Nginx 的管理進程和?作進程中,同?個進程內的所有線程都會共享這個虛擬機,并在虛擬機中執?Lua代碼。在性能上,OpenResty接近或超過 Nginx 的C模塊,?且開發效率更?。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89966.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4x4矩陣教程

4x4矩陣教程 1. 簡介 四維矩陣是計算機圖形學和3D變換中的重要工具&#xff0c;用于表示三維空間中的仿射變換。本教程將介紹如何使用C實現四維矩陣的基本運算和變換。 2. 代碼實現 2.1 頭文件 (matrix4x4.h) #ifndef MATRIX4X4_H #define MATRIX4X4_H#include <array> #…

Oracle 數據庫共享池與大池調優指南

在 Oracle 數據庫的內存管理中&#xff0c;共享池&#xff08;Shared Pool&#xff09;和大池&#xff08;Large Pool&#xff09;是 SGA&#xff08;系統全局區&#xff09;中負責緩存與資源分配的核心組件。合理配置和調優這兩個池&#xff0c;能顯著提升數據庫性能 —— 尤其…

C# Lambdab表達式 Var 類

Lambdab 是用于創建一個方法的表達式Func<參數1類型, 參數2類型, 返回值類型> fnName >(參數1 參數2) {方法代碼體}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//調用時和普通方法一致 Console.WriteLine(fnName(10,20)); // false…

【Python】常見模塊及其用法

文章目錄1. 什么是模塊和包&#xff1f;2. 常見的模塊及其用法2.1 time概覽2.1.1 時間獲取方法2.1.2 時間格式化與解析2.1.3 程序計時與延遲2.1.4 時間轉換2.2 random概覽2.2.1 基本隨機數2.2.2 隨機整數2.2.3 序列操作2.2.4 概率分布2.2.5 隨機種子2.2.6 狀態管理2.3 os概覽2.…

洛谷 P3478 [POI 2008] STA-Station

【題目鏈接】 洛谷 P3478 [POI 2008] STA-Station 【題目考點】 1. 樹形動規&#xff1a;換根動規 換根動規&#xff0c;又名二次掃描法&#xff0c;一般是給一顆不定根樹&#xff0c;通過兩次掃描來求解。 我們可以先任選一個根結點root&#xff0c;通過樹形動規的思想計算…

【爬蟲】03 - 爬蟲的基本數據存儲

爬蟲03 - 爬蟲的數據存儲 文章目錄爬蟲03 - 爬蟲的數據存儲一&#xff1a;CSV數據存儲1&#xff1a;基本介紹2&#xff1a;基本使用3&#xff1a;高級使用4&#xff1a;使用示例二&#xff1a;JSON數據存儲1&#xff1a;基礎json讀寫2&#xff1a;字符串和對象的轉換3&#xff…

深入分析計算機網絡數據鏈路層和網絡層面試題

計算機網絡體系結構1. 請簡述 OSI 七層模型和 TCP/IP 四層模型&#xff0c;并比較它們的異同。OSI 七層模型&#xff1a;應用層&#xff1a;直接為用戶的應用進程提供服務&#xff0c;如 HTTP&#xff08;超文本傳輸協議&#xff0c;用于 Web 瀏覽器與服務器通信&#xff09;、…

云服務器新裝的mysql8,無法通過遠程連接,然后本地pymysql也連不上

阿里云服務器&#xff0c;用apt-get新裝的mysql-server&#xff0c;竟然無法通過遠程連接到&#xff0c;竟然是這個原因。不是防火墻&#xff0c;iptables早就關了。也不是安全組&#xff0c;不是人為限制訪問的話&#xff0c;根本沒必要弄安全組 排查過程 netstat -antop|grep…

質量即服務:從測試策略到平臺運營的全鏈路作戰手冊

&#xff08;零&#xff09;為什么需要“質量即服務” 當業務方說“今晚一定要上線”&#xff0c; 當開發說“我只改了兩行代碼”&#xff0c; 當運維說“回滾窗口只有 5 分鐘”&#xff0c; 質量必須像水電一樣隨取隨用&#xff0c;而不是上線前的大壩泄洪。 這篇手冊提供一張…

Java -- 自定義異常--Wrapper類--String類

自定義異常&#xff1a;概念&#xff1a;當程序中出現了某些錯誤&#xff0c;但該錯誤信息并沒有在Throwable子類中描述處理&#xff0c;這個時候可以自己設計異常&#xff0c;用于描述該錯誤信息。步驟&#xff1a;1. 定義類&#xff1a;自定義異常類名&#xff08;程序員自己…

一文速通《線性方程組》

目錄 一、解題必記知識點 二、解題必備技巧 三、非齊次線性方程組求解 四、齊次線性方程組求解 ★五、解析題目信息&#xff0c;獲取暗含條件 一、解題必記知識點 (1) (2)基礎解系線性無關&#xff0c;基礎解系 解空間的一個基&#xff0c;基 一組線性無關的、能夠生…

【Django】DRF API版本和解析器

講解 Python3 下 Django REST Framework (DRF) API 版本控制解析器&#xff08;Parser&#xff09;一、DRF API 版本控制詳解 API 版本控制是構建健壯、可維護的 RESTful API 的關鍵&#xff0c;尤其在項目演進中需要兼容不同版本的客戶端請求。 1.1 API 版本控制的核心原理 AP…

Windows系統暫停更新工具

功能說明 暫停更新至2999年恢復系統更新徹底禁用更新&#xff08;不可逆&#xff09; 使用方法 下載解壓后雙擊運行 .bat 文件 輸入數字選擇功能&#xff1a; 輸入 1&#xff1a;暫停更新至2999年&#xff08;推薦&#xff09;輸入 2&#xff1a;恢復系統更新輸入 3&#xf…

git push新版問題解決

git 好像不能通過username:password的方式來git push了。但我的電腦依然彈出username和password的彈窗。轉戰ssh來git push。由于之前是用git clone克隆的&#xff0c;需要再轉換成ssh的url來git push。

PyCharm + AI 輔助編程

PyCharm AI&#xff1a;初學者友好的 2 個實用場景&#xff08;附操作步驟&#xff09; PyCharm 專業版&#xff08;或通過插件集成&#xff09;支持 AI 輔助編程&#xff08;如 JetBrains AI 或 GitHub Copilot&#xff09;&#xff0c;能根據代碼上下文自動生成代碼、解釋邏…

瘋狂星期四文案網第15天運營日記

網站運營第15天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨天只有20來ip, 太慘了&#xff0c;感覺和最近沒有發新段子有關&#xff0c;也沒有發新的外鏈&#xff0c;不知道這周四會怎么樣 昨日搜…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題 摘要 在使用 PyCharm 控制臺或命令行執行 pip install Cython 時&#xff0c;常會遇到 ModuleNotFoundError: No module named Cython 的報錯。本…

freertos任務調度關鍵函數理解 vTaskSwitchContext

void vTaskSwitchContext(void) {//my_printf( "uxSchedulerSuspended %d\n", uxSchedulerSuspended );/* 調度器處于掛起狀態 */if (uxSchedulerSuspended ! (UBaseType_t)pdFALSE) {/*** The scheduler is currently suspended - do not allow a context* switch.…

CPU 密集型 和 I/O 密集型 任務

文章目錄**CPU 密集型任務&#xff08;CPU-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化 CPU 密集型任務&#xff1a;**I/O 密集型任務&#xff08;I/O-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化…

[2025CVPR-小目標檢測方向]基于特征信息驅動位置高斯分布估計微小目標檢測模型

核心問題 ?小目標檢測性能差&#xff1a;?? 盡管通用目標檢測器&#xff08;如 Faster R-CNN, YOLO, SSD&#xff09;在常規目標上表現出色&#xff0c;但在檢測微小目標&#xff08;如 AI-TOD 基準定義的&#xff1a;非常小目標 2-8 像素&#xff0c;小目標 8-16 像素&…