主頁 > 軟體設計 > 紅包系統流量高并發技術詳解

紅包系統流量高并發技術詳解

2021-02-14 11:44:54 軟體設計

發紅包是目前各大互聯網公司最常用的營銷手段之一,它形式多樣,內容豐富,2016 年底蘇寧金融開啟了紅包系統及相關系統的專案開發,

本文將對蘇寧金融紅包系統的架構部署方式、演變程序、技術優化等方面進行詳細闡述,

紅包系統的技術挑戰

紅包,升級版的秒殺系統,紅包系統應當具備秒殺系統所具備的特性,

大量用戶搶紅包帶來了系統的高并發壓力;大量用戶搶同一紅包帶來了資料一致性問題:紅包不能超發,漏發,重復發;而由于紅包涉及到資金,也會帶來資金安全問題,

由上述可見,一套紅包系統,主要的技術挑戰在于:系統的高并發,一致性,高回應,安全性等,

紅包系統性能優化(高性能&資料一致性)

流量的削峰填谷

削峰填谷:顧名思義,就是在流量洪峰到來之前在系統負載比較低的時候進行資料預熱等操作,用來分散紅包活動開始后的高并發流量,

紅包類營銷活動的業務特點:定時的洪峰流量,通過“削峰填谷”有效減少瞬間流量對系統造成的沖擊,

開戶:用戶參與蘇寧搶紅包活動,均需提前開通紅包賬戶,在紅包活動開始后,用戶瞬時并發大,

短時間內大量用戶參與活動,開通紅包賬號會將訪問請求瞬間提交到后端應用,會給后端的業務系統造成很大的開戶壓力,

為減輕基礎服務壓力,將流量峰值進行削峰,我們采取了如下措施:

  • 提前蓄水開戶,在活動爆發前,采集近期內的活躍會員進行批量提前開戶,降低活動開始時的開戶壓力,

  • 進入紅包活動聚合頁提前開戶,在用戶進入紅包活動聚合頁時提前開戶,降低發紅包以及搶紅包中的開戶壓力,

640?wx_fmt=png

預熱活躍用戶

640?wx_fmt=png

流量削峰填谷

異步化

異步紅包充值及訂單持久化:在紅包發放環節,大量用戶紅包需要到賬,如果不對峰值進行處理,壓力將會直接轉嫁給上游系統造成處理壓力,間接導致紅包系統堵塞,

因此將充值轉為異步處理,先將充值任務進行佇列存盤,然后分攤到多臺機器(利用分布式優點)處理,提升系統處理效率,避免單臺節點壓力過大,

多級快取(熱點資料全域快取化)

640?wx_fmt=png

EHCACHE:本地對讀取多,修改少的資料做 EHCACHE 本地快取處理,減少訪問資料庫、分布式快取的次數,

資料庫快取:提高資料庫熱表的資料快取大小,

Redis:全域 Redis 資料化處理,利用 Redis 單執行緒,基于記憶體讀寫高 QPS 的特性,解決熱點資料高并發,執行緒安全等一系列問題,

熱點資料(包括紅包訂單,用戶發,搶記錄等)均存盤至 Redis 系統中,并進行多分片部署,通過 Redis 高并發讀寫的特性,提升系統吞吐量,

另外,目前高并發 Java 系統的核心都是分布式微服務集群部署,這種部署情況下 JVM 級別的鎖,執行緒安全的資料型別等都不適用,那么如何保證紅包敏感資料在高并發下的執行緒安全性呢?

答案還是 Redis,利用 Redis 單執行緒的處理特性,Redis 在修改資料方面是執行緒安全的,

以下為紅包系統中用到 Redis 存盤的部分場景:

640?wx_fmt=png

Redis Pipeline 管道模式

煙花紅包燃放環節對于系統回應時間要求很高,開發初期按照 2000 人參與,5S 回應時間設計,系統已經達到性能需求的要求,

但在活動運營后,易購將活動參與人數提高到了 8888 人,按照原有方案,回應時間變為 13S,耗時大大加長,無法滿足性能要求,

在對 Redis 進行大批量的操作時,可以使用 Pipeline 模式,通過減少網路傳輸時間,從而極大的提高系統性能,

在煙花紅包發放中需要對 Redis 進行大量查詢操作,在實際測驗中發現在對接近 1W 個命令進行回圈普通同步模式時需要 10S 左右,而改用 Pipeline 模式后處理時間在 100 毫秒以內,

分布式鎖組件

640?wx_fmt=png

回呼式的分布式鎖組件

在拆紅包環節時可能出現同一用戶拆兩次紅包的問題:當用戶點擊過快時,可能同一用戶的兩個執行緒同時通過了是否拆紅包的條件校驗,在這種情況下,該用戶可以拆兩次同一個紅包,

針對這一問題,我們通過對紅包單號,用戶編號兩個維度加分布式鎖來解決,

目前常用的分布式鎖大致有三種實作:

  • 資料庫

  • Zookeeper

  • Redis

基于實際執行效率和實作難度的考慮,在紅包系統使用 Redis 實作了分布式鎖組件,

加鎖:使用高版本 Redis set 命令的 EX,PX 屬性,實作加鎖,超時時間設定的原子操作,

640?wx_fmt=png

加鎖

釋放鎖:通過 Lua 腳本來實作鎖值判斷,釋放鎖的原子操作,

640?wx_fmt=png

釋放鎖

640?wx_fmt=png

執行入口

搶紅包、拆紅包前的高效前置校驗

拆紅包作為紅包操作中并發最高,處理步驟比較復雜的部分,如何削減拆紅包的流量至關重要,

搶紅包是拆紅包大并發流量的第一道入口,系統設計要盡可能滿足快進快出的要求,

640?wx_fmt=png

搶紅包流程圖

搶紅包時只通過快取計數器做簡單的紅包狀態檢驗,可以過濾掉大部分拆紅包的流量;計數器設定為僅從主 Redis 讀,避免隨機讀的延遲問題,

紅包系統高可用架構實踐

分布式任務調度

分布式任務調度包括紅包超時退款、例外補償等,紅包超過設定時間未被領取完如何退款?紅包發放因為系統、網路等各方面的原因,導致用戶紅包到賬失敗如何給用戶進行補償?

因為紅包涉及到資金問題,所以在紅包發放、到賬、退款方面需要萬無一失,否則可能會遭到用戶的大量投訴,在這里我們用蘇寧統一任務調度平臺進行分布式部署系統的定時任務調度,

定時掃描資料庫中符合條件的訂單,進行超時退款,發放例外重復訂單發放等操作,

支付鏈路&賬戶分離

640?wx_fmt=png

通過設計專用的紅包極簡收銀臺、紅包賬戶實作紅包發、搶、拆等程序與普通賬戶、支付鏈路分離,避免在大促時對支付、會員、賬務核心等購物核心主鏈路造成壓力,

高可用部署架構

640?wx_fmt=png

上圖為蘇寧金融會員紅包系統目前的單集群部署示意圖,是典型的蘇寧技術體系下的分布式,高可用系統部署結構,

它具備水平擴容,容災和監控的能力:

  • 前端流量會通過 HLB 來分發和負載均衡至 WAF 平臺,

  • WAF 經過防火墻處理后分發至 HTTP 服務集群(目前主要為 Nginx),

  • 然后由 HTTP 服務器進行流量反向代理,分發至后端應用服務器進行處理,

  • 服務與服務之間,通過 RPC 遠程呼叫框架進行服務的發現,注冊與呼叫,訊息佇列使用 Kafka 進行通信,

  • 在存盤層使用 Mycat 來訪問分布式資料庫進行讀寫操作,分布式快取使用多分片 Redis 進行存盤,

服務器使用 Zabbix 平臺進行性能監控,統一任務調度平臺進行分布式任務的分發,使用云跡平臺進行分布式日志的采集與查看,

為同時應對多個渠道,多種型別的紅包類大促營銷活動,紅包系統采用多個集群部署方式部署,在本次雙十一大促中同時為集團各產業紅包—獎勵金紅包、體育紅包、圈子紅包等營銷產品提供高性能高可用的服務支撐,

640?wx_fmt=png

紅包系統的大促保障

紅包系統作為公司每次大促營銷活動的重要參與系統之一,在 818&雙十一等大促中需要應對瞬間海量流量,那么我們如何在大促中監控、保障系統呢?

系統監控

目前在大促活動監控方面,主要分為兩大塊:

  • 業務監控

  • 中間件監控

業務監控:蘇寧金融自研監控平臺,可以細化到服務秒級的呼叫數、成功率、呼叫耗時等的監控,可以靈活針對各項維度進行告警設定,在業務例外時進行短信或者郵件告警,

業務監控的意義在于實時監控生產線上的流量情況,在流量接近或者超過業務預期的性能閥值后,應當盡快進行服務降級或者生產擴容等緊急措施,

640?wx_fmt=png

鏈路式服務監控

中間件監控:中間件的監控平臺較多,Zabbix 平臺監控服務器的性能指標,包括 CPU 使用率,記憶體使用率,磁盤使用率,網路流量等,

Redis 監控使用 Promes 監控平臺;資料庫監控使用蘇寧自研資料庫管理平臺,可實時查看資料庫狀態,是否存在慢 SQL 等,

例外監管及日志查看使用蘇寧自研分布式日志平臺,可實時查看分布式系統日志,系統中的例外情況等,

中間件監控可以發現硬體層面的問題,例如系統壓力過大時造成 CPU 過高等,可以根據具體指標進行擴容或者聯系系統運維解決硬體問題,

多級流控

640?wx_fmt=png

在流量洪峰來臨時,如何優先保障系統穩定呢?首先,通過性能壓測等手段確認系統的最大承受能力,為每個服務&介面設定具體的流量閥值,

其后在各級流控平臺進行流控配置:

  • 防火墻:防火墻主要針對 HTTP 服務進行流控,并可提供防黃牛、防網路攻擊、負載控制等相關功能,

  • 服務全域流控:防火墻僅能針對 HTTP 服務進行流控,那么系統提供的 RPC 微服務介面集群流控則依賴內部流控平臺,可提供系統級的全域服務流控,

  • 服務單機流控:RPC 微服務介面單節點流控配置與 RPC 服務后臺,提供單機令牌式流控服務,

  • 用戶級流控:以上幾種流控方式均為服務級別的流控,尚無法控制單個用戶的防刷操作,在這里我們開發了基于 Redis 的用戶級流控,可以控制單個用戶一段時間內的訪問次數,

為什么要配置多種級別的流控服務呢?主要基于以下幾點考慮:

  • 基于高可用的理念,防止單個流控服務出現故障時可以有其他流控進行補充,

  • 不同流控方式所控制的維度不一樣,有針對 HTTP 服務的,有針對 RPC 服務的;級別也不一致,有全域和單機的,在流量控制方面做到萬無一失,

  • 控制的方式不一樣,有基于 TPS 控制的,也有基于令牌式控制的,還有根據時間范圍內次數進行控制,

系統降級

基于 Zookeeper 的分布式配置平臺設定應用開關閥值,在系統壓力過大時,通過開啟關閉非核心應用功能,保障核心主鏈路的可用,

例如在發紅包、搶紅包的流量洪峰到來前,通過在配置平臺修改開關值,可以暫時性的關閉紅包消費功能(余額提現、兌券等),開關關閉后,消費功能暫時不可用,在流量洪峰消退后,打開開關,即可恢復消費功能,

打開和關閉的操作在半分鐘內可以完成,快速保護紅包核心主鏈路和恢復功能完整,

未來的挑戰及方向

紅包系統從 2016 年年底至今,經歷了公司的數個大促,目前在業務方面,也面臨著一系列的挑戰:

  • 隨著紅包形式的多樣化,業務不斷提出新的紅包玩法;如何在現有能力的基礎上,提升系統復用性,核心服務中臺化,快速兼容新的紅包玩法,

  • 紅包系統目前高度依賴 Redis,在現有 Redis 資料持久化的基礎上,需要在代碼層面進一步完善快取資料補償能力,

  • 目前的紅包高可用部署基于一個 IDC 機房的集群部署,如果整個 IDC 機房服務都不可用的話,那么服務就需要切換到備機房,目前還無法做到無縫對接;在這種情況下,異地多活部署勢在必行,

每年都會有新的紅包活動,而隨著蘇寧易購和蘇寧金融用戶群體的不斷擴大,紅包系統面臨的挑戰也越來越多,

以后我們將圍繞高并發,高可用,高一致性的方向,不斷優化系統部署,代碼結構,未來的路還很長,我們將砥礪前行,

作者:姜春峰、邢愷

簡介:姜春峰,蘇寧金融研發中心技術副總監,目前負責蘇寧金融會員及互聯網研發中心的前端、門戶、內容、增長產品研發的技術管理作業,具有 8 年互聯網金融領域相關研發以及技術管理經驗;擅長互聯網金融領域應用架構,涉獵支付、理財、保險、營銷、生活服務產品等產品領域應用研發,有豐富的系統性能優化經驗,具備很強的技術領導力,

邢愷,蘇寧金融研發中心技術經理,主要負責蘇寧金融會員及互聯網研發中心的紅包及營銷產品線研發作業,具有 7 年軟體研發作業經驗;參與過蘇寧集團多次紅包類大促活動的開發;擅長高并發服務端系統開發架構,對構建高性能服務端系統具有比較豐富的實戰經驗,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/259442.html

標籤:其他

上一篇:微服務架構設計模式筆記--第三章 微服務架構中的行程間通信

下一篇:Redis分布式鎖的實作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more