如何設計一個秒殺系統
- 自己可以code一個 。
- 用百度H5做 。
- 用互動大師做 。
官方出品!揭秘阿里巴巴APP 8.0 視覺品牌升級背后的設計思路
阿里巴巴副總裁、中國內貿事業部總經理汪海在對外分享時提出 1688 已經從信息平臺時代進入數字化營銷平臺時代,讓 1688 用戶在平臺內完成營銷和銷售一體化的整個商業閉環 。1688 的使命也升級成「在數字化經濟時代,讓天下沒有難做的生意!」在全新的業務態勢下,為了更好的滿足用戶需求,阿里巴巴(1688)主客升級勢在必行 。
首頁重要性
首頁既是業務分流的中心場景,也是平臺賣家判斷平臺打法,買賣家感知平臺價值的重要「門面」 。從 UED 專業視角來看,首頁是定義 APP 內體驗范式及視覺風格的核心場景 。
如何改?
1. 盤點現象,定義問題
滿足業務新的訴求:平臺階段性戰略不同,1688 從曾經的信息平臺過渡到交易平臺,如今向數字營銷平臺轉型,舊的內容框架難以承載業務的新發展 。
提升分流質量:從過去的數據效果來看,需重新判斷,在 For 特色采購需求和服務大面采購需求之前,如何平衡調優,提升首頁的流量轉化效能 。
體驗升級:移動端 APP 天然生長在手機系統上,系統的風格更迭也牽動著 APP 的變化和升級 。在 8.0 升級前,1688APP 存在著 5.0、6.0、7.0 多個由不同設計師在不同時間點所設計的場景,到8.0,APP 趨待從框架層、表現層以及品牌等方面進行統一及升級 。
改版策略
1. 聚焦用戶價值,基于業務打法升級內容框架
APP 升級前與業務對焦,我們收到三點訴求:
在內容框架制定上,我們聚焦用戶價值,舍掉 7.0 時的內容版塊個性化,聚焦做商品的個性化,僅保留For大面用戶的營銷、內容場景,提升算法推薦區的曝光率,以此區域的商品做首頁的直接轉化 。
2. 弱化容器,突出內容,塑造心智
視覺容器升級
做平視覺框架,選擇「大間距分隔」,為內容留出干凈、簡潔的視覺空間 。
精簡內容柵格,避免形式給用戶閱讀帶來的負擔 。
提高留白率,提升頁面整體的透氣性,為內容留出更清爽、輕松的閱讀空間 。
拉大字體大小的梯度,加重字體顏色梯度,提升文字的清晰度和可讀性 。
強調版塊特性,塑造買家心智感知,達成業務目標
強化搜索:7.0時,曾上線過將搜索做到「主觀上覺得顯眼」的測試方案,但相較于之前沉浸式搜索,數據幾乎沒變化 。
8.0 階段,從視覺表現層跳出看:「強化搜索」并不意味把搜索設計得更「顯眼」,而是達成「讓更多用戶更高頻地使用搜索」這一目標 。如提升搜索底紋詞、熱搜詞精準度和吸引力、增加搜索布點等,都可能助力達成業務目標 。
基于用戶單手操作時,拇指在屏幕不同區域的點擊體驗,選擇將搜索組件移到更易于點擊、視線更聚焦的屏幕位置,上線后數據提升非常明顯 。
Banner 升級:7.0 的 Banner 畫面豐富度高,加之描述字段多,用戶閱讀有一定成本,較難在 3 秒內掌握全 Banner 的信息 。此外,相比于 C 類用戶,B 類用戶會更偏理性,我們選擇以更冷靜、克制的「視覺語氣」與 B 類商人對話,而非渲染氛圍引導點擊 。(上線后,同樣的活動內容,按新、老兩版規范設計投放兩套 Banner,新版較老版 UV CTR 約高出 48%)
For 新人:以差異化的利益、個性化秒殺、新人攻略做用戶的承接 。
營銷場景心智差異化表達:營銷由伙拼爆品、天天特賣兩部分組成,我們判斷爆品主打心智為「賣得火爆又便宜」,特賣主打心智是「限時限量搶便宜」,選擇將兩個區塊最關鍵的特質做強化表達 。
內容場景(直播)動態化、互動感、實時性傳遞:抽象出直播間的方形版面+內容疊加形式來設計,大坑位以動圖傳遞給用戶直播的動態感,以紅包、個性化商品的多維實時輪播氣泡傳達直播的互動感、實時性 。
3. 升級品牌,貫穿APP場景
為什么要做APP應用內的品牌設計?
品牌設計是將內容層(平臺價值)與接收層(用戶)做柔性鏈接的一環,譬如在 APP 場景中,由于有商品、商家、商機等「干貨」,即使不特意做品牌設計,用戶也能與平臺保持剛性、穩定的連接 。而反過來看,品牌做得很好,但平臺沒有「干貨」,用戶也不會單奔著品牌設計來平臺 。我們認為,做 APP 應用內的品牌設計,核心價值在于助力用戶認知到平臺特性,感知平臺價值 。從設計專業視角來看,APP 應用內的品牌設計,有利于定義并統一 APP 內體驗范式及視覺風格,保障用戶的體驗 。
怎么做?
每位設計師所處的業務環境不一樣,解決問題策略和方式也千差萬別,在 APP 應用內的品牌設計中,個人選擇是通過厘清內容層(平臺)多層次訴求及 For 用戶的價值點,認知、感知接收層(用戶)特質及內容傾向,基于內容層底料+接收層用戶特質確定設計底層范式,塑造用戶感知 。
1. 圖形范式
在阿里巴巴商業操作系統中,1688 聚焦做 B 類業務,直接服務對象是 B 類買賣家,業務細分出檔口尖貨、淘工廠、企業采購、淘貨源、微商代發、工業品超級店、跨境專供等,這些都是具有一定 B 類特質及體量感的場景,故在 APP 業務門洞及常規圖標的表達上,基于扁平 vs 寫實、輕盈 vs 厚重、活潑 vs 穩重的維度,圖形選定輕擬物、弱對比的設計范式,塑造 B 類場景 For 買家的沉穩、份量感 。
此外,異常/空白場景也是平臺與用戶互動,塑造用戶感知品牌的機會 。在空態 情感 化插圖部分的繪制上,力求塑形出有份量、易讀、有意味的場景以示對應空態,并佐以輕微動效,增強空態的互動感 。(在收藏夾、我的供應商等工具型場景,基于空態信息的價值考慮,將空態與工具新手引導相結合,并未做常規的插圖 。)
2. 色彩范式
標準色
隨著業務的發展,我們基于新的業務態勢,豐富了 1688 品牌色,以橙紅色作營銷、利益屬性的表達,以商務藍作服務、數字化屬性的表達,以金色作權益屬性的表達 。
輔助色
在實際產品設計中,品牌色并不足以表達各類業務場景中的多層次的內容 。因此,基于 VI 品牌色,裂變出不同重量、層次更豐富的品牌輔助色 。
場景用色規則
基于買家角色及場景特征定義用色規則 。
1688色域及選色示意
以 HSB 模式劃定出偏沉穩的 1688 色域,在日常 banner 及業務場景中可靈活取用 。
3. 動效范式及應用
動效是設計的重要手段,良好的動效表達能增強信息表達強度,清晰信息層級關系,提升用戶體驗的舒適度 。做動效之前,將 APP 信息結構平整到三層,保障內容在頁面簡潔明暢地呈現 。
在實際落地中,動效實現非常依賴技術資源,故動效設計之前,應考慮一個前提:動效設計增益內容表達,價值可論證,效果可衡量;同時,考慮接收層用戶的商人特質,我們期望動效表達給用戶以穩定感,并且在設計表達上能兼顧效率 。
在動效呈現部分,主要以緩入、緩出、緩動結合曲線來調節,總的來說,內容入場時節奏稍慢,速度緩,分層加載,交代清信息在 Z 軸上的層次關系,內容出場時節奏快,速度快,內容層級不用再做分層消失 。
APP 內典型場景的動效案例及演示:
4. 業務品牌的價值傳遞
此外,除以上在圖形、色彩、動效等基礎維度收口外,我們也需要將業務品牌放聲給買賣家,以達成業務品牌的價值傳遞 。在 1688 向數字營銷平臺轉型的階段,業務提出了「源頭廠貨通天下」的口號,我們通過設計手段,利用 APP 開機啟動頁及下拉刷新的空間,將「貨通天下」的概念強化表達 。
結語
以上便是此次首頁改版階段性的記錄 。在 8.0 的視覺體系里,為更好地突出內容,視覺容器選擇盡可能做輕、做平,以冷靜、克制的「視覺語氣」與 B 類商人對話 。當然,這是設計師和業務同學階段性的選擇 。后續品牌的完善及產品的優化,仍需結合數據持續打磨
(二)微信紅包高并發系統設計方案(1)2017年1月28日,正月初一,微信公布了用戶在除夕當天收發微信紅包的數量——142億個,而其收發峰值也已達到76萬每秒 。百億級別的紅包,如何保障并發性能與資金安全?這給微信帶來了超級挑戰 。面對挑戰,微信紅包在分析了業界“秒殺”系統解決方案的基礎上,采用了 SET化、請求排隊串行化、雙維度分庫表 等設計,形成了獨特的高并發、資金安全系統解決方案 。實踐證明,該方案表現穩定,且實現了除夕夜系統零故障運行 。概要:
一、業務 特點 :海量的并發要求;嚴格的安全級別
二、技術 難點 :并發請求搶鎖;事務級操作量級大;事務性要求嚴格
三、解決高并發問題 通常 使用的 方案 :
1.使用內存操作替代實時的DB事務操作(優點:內存操作替代磁盤操作,提高了并發性能 。)
2使用樂觀鎖替代悲觀鎖 。應用于微信紅包系統,則會存在下面三個問題:滾并返回失敗;并發大失敗,小成功 。DB壓力大 。
四、微信 紅包 系統的高并發解決 方案 :
1.系統垂直SET化,分而治之 。
2.邏輯Server層將請求排隊,解決DB并發問題 。
3.雙維度庫表設計,保障系統性能穩定
類似“秒殺”活動,群里發一個紅包=“秒殺”商品上架;搶紅包的動作=“秒殺”的查詢庫存;拆紅包=“秒殺”
同一時間有10萬個群里的用戶同時在發紅包,那就相當于同一時間有10萬個“秒殺”活動發布出去 。10萬個微信群里的用戶同時搶紅包,將產生海量的并發請求 。
微信紅包是微信支付的一個商戶,提供資金流轉服務 。
用戶發紅包=購買一筆“錢”(在微信紅包這個商戶上),并且收貨地址是微信群 。當用戶支付成功后,紅包“發貨”到微信群里,群里的用戶拆開紅包后,微信紅包提供了將“錢”轉入折紅包用戶微信零錢的服務 。
資金交易業務比普通商品“秒殺”活動有更高的安全級別要求 。普通的商品“秒殺”商品由商戶提供,庫存是商戶預設的,“秒殺”時可以允許存在“超賣”、“少賣”的情況 。但是對于微信紅包,100元不可以被拆出101元;領取99元時,剩下的1元在24小時過期后要精確地退還給發紅包用戶,不能多也不能少 。
在介紹微信紅包系統的技術難點之前,先介紹下簡單的、典型的商品“秒殺”系統的架構設計,如下圖所示 。
該系統由接入層、邏輯服務層、存儲層與緩存構成 。Proxy處理請求接入,Server承載主要的業務邏輯,Cache用于緩存庫存數量、DB則用于數據持久化 。
一個“秒殺”活動,對應DB中的一條庫存記錄 。當用戶進行商品“秒殺”時,系統的主要邏輯在于DB中庫存的操作上 。一般來說,對DB的操作流程有以下三步:
a. 鎖庫存
b. 插入“秒殺”記錄
c. 更新庫存
a.鎖庫存是為了 避免 并發請求時出現“ 超賣 ”情況 。同時要求這 三步操作 需要在 一個事務 中完成(難點:并發請求搶鎖) 。
第一個事務完成提交之前這個鎖一直被第一個請求占用,后面的所有請求需要 排隊等待。同時參與“秒殺”的用戶越多,并發進DB的請求越多,請求 排隊越嚴重。
紅包系統的設計上,除了并發請求搶鎖之外,還有以下兩個突出難點 :
首先,事務級操作量級大。上文介紹微信紅包業務特點時提到,普遍情況下同時會有數以萬計的微信群在發紅包 。這個業務特點映射到微信紅包系統設計上,就是有數以萬計的“并發請求搶鎖”同時在進行 。這使 得DB的壓力 比普通單個商品“庫存”被鎖要大很多倍 。
其次,事務性要求嚴格。微信紅包系統本質上是一個資金交易系統,相比普通商品“秒殺”系統有更高的事務級別要求 。
普通商品“秒殺”活動系統,解決高并發問題的方案,大體有以下幾種:
如圖2所示,將“實時扣庫存”的行為上移到 內存Cache中操作,內存Cache操作成功直接給Server返回成功,然后 異步落DB持久化。
優點:提高了并發性能 。
缺點: 在內存操作 成功 但 DB持久化失敗,或者內存 Cache故障 的情況下,DB持久化會 丟數據,不適合微信紅包這種資金交易系統 。
商品“秒殺”系統中,樂觀鎖的具體應用方法,是在DB的“庫存”記錄中維護一個版本號 。在更新“庫存”的操作進行前,先去DB獲取當前版本號 。在更新庫存的事務提交時,檢查該版本號是否已被其他事務修改 。如果版本沒被修改,則提交事務,且版本號加1;如果版本號已經被其他事務修改,則回滾事務,并給上層報錯 。
這個方案解決了“并發請求搶鎖”的問題,可以提高DB的并發處理能力 。
應用于微信紅包系統,則會存在下面三個問題 :
1.在并發搶到相同版本號的拆紅包請求中,只有一個能拆紅包成功,其他的請求 將事務回滾并返回失敗,給用戶 報錯,用戶體驗完全不可接受 。
2.將會導致 第一時間 同時拆紅包的用戶有一部分直接 返回失敗,反而那些“ 手慢 ”的用戶,有可能因為 并發減小 后拆紅包 成功,這會帶來用戶體驗上的負面影響 。
3.會帶來 大數量 的 無效 更新 請求 、事務 回滾,給 DB 造成不必要的額外 壓力。
微信紅包用戶發一個紅包時,微信紅包系統生成一個ID作為這個紅包的唯一標識 。接下來這個紅包的所有發紅包、搶紅包、拆紅包、查詢紅包詳情等操作,都根據這個ID關聯 。
紅包系統根據這個紅包ID,按一定的規則(如按ID尾號取模等),垂直上下切分 。切分后,一個垂直鏈條上的邏輯Server服務器、DB統稱為一個SET 。
各個SET之間相互獨立,互相解耦 。并且同一個紅包ID的所有請求,包括發紅包、搶紅包、拆紅包、查詳情詳情等,垂直stick到同一個SET內處理,高度內聚 。通過這樣的方式,系統將所有紅包請求這個巨大的洪流分散為多股小流,互不影響,分而治之,如下圖所示 。
這個方案解決了同時存在海量事務級操作的問題,將海量化為小量 。
紅包系統是資金交易系統,DB操作的事務性無法避免,所以會存在“并發搶鎖”問題 。但是如果到達DB的事務操作(也即拆紅包行為)不是并發的,而是串行的,就不會存在“并發搶鎖”的問題了 。
按這個思路,為了使拆紅包的事務操作串行地進入DB,只需要將請求在 Server層以FIFO ( 先進先出 )的方式排隊,就可以達到這個效果 。從而問題就集中到Server的FIFO隊列設計上 。
微信紅包系統設計了分布式的、輕巧的、靈活的FIFO隊列方案 。其具體實現如下:
首先,將同一個紅包ID的所有請求stick到同一臺Server 。
上面SET化方案已經介紹,同個紅包ID的所有請求,按紅包ID stick到同個SET中 。不過在同個SET中,會存在多臺Server服務器同時連接同一臺DB(基于容災、性能考慮,需要多臺Server互備、均衡壓力) 。
為了使同一個紅包ID的所有請求,stick到同一臺Server服務器上,在SET化的設計之外,微信紅包系統添加了一層基于紅包ID hash值的分流,如下圖所示 。
其次,設計單機請求排隊方案 。
將stick到同一臺Server上的所有請求在被接收進程接收后,按紅包ID進行排隊 。然后 串行地進入worker進程 (執行業務邏輯)進行處理,從而達到 排隊 的效果,如下圖所示 。
最后,增加memcached控制并發 。
為了 防止 Server中的請求隊列過載導致隊列被降級,從而所有請求 擁進DB,系統增加了與Server服務器同機部署的 memcached,用于控制拆同一個紅包的 請求并發數。
具體來說,利用memcached的 CAS原子累增操作,控制同時進入 DB執行拆紅包事務的請求數,超過預先設定數值則 直接拒絕服務。用于 DB負載升高時的降級 體驗 。
通過以上三個措施,系統有效地 控制了DB的“并發搶鎖” 情況 。
紅包系統的分庫表規則,初期是根據 紅包ID的hash值 分為多庫多表 。隨著紅包數據量逐漸增大,單表數據量也逐漸增加 。而DB的性能與單表數據量有一定相關性 。當單表數據量達到一定程度時,DB性能會有大幅度下降,影響系統性能穩定性 。采用 冷熱分離,將歷史冷數據與當前熱數據分開存儲,可以解決這個問題 。
系統在以 紅包ID維度 分庫表的基礎上,增加了以 循環天分表的維度,形成了 雙維度分庫表 的特色 。
具體來說,就是分庫表規則像db_xx.t_y_dd設計,其中,xx/y是紅包ID的 hash值后三位,dd的取值范圍在01~31,代表一個月天數最多 31 天 。
通過這種雙維度分庫表方式,解決了DB單表數據量膨脹導致性能下降的問題,保障了系統性能的穩定性 。同時,在熱冷分離的問題上,又使得數據搬遷變得簡單而優雅 。
綜上所述,微信紅包系統在解決高并發問題上的設計,主要采用了SET化分治、請求排隊、雙維度分庫表等方案,使得單組DB的并發性能 提升了8倍 左右,取得了很好的效果 。
http://www.infoq.com/cn/articles/2017hongbao-weixin
Redis 秒殺系統的設計與實現 還記得剛工作那會,每每聽到大牛們聊技術,各種專業術語,巴拉巴拉的,簡直像是在聽天書,比如什么中間件、分布式、SOA、無狀態、熱更新、懶加載、ACID、LVS、LDAP、VIP、CDN、負載均衡、魯棒性、POJO、DSL、DI、IOC,太多太多了 。一轉眼快 10 年過去了,當很多新人再問到我這些名詞的時候,我就在想,能不能用通俗易懂的大白話,就能聊明白這些專業的技術知識呢?
最近,給幾個公司做技術咨詢,經常會聊到秒殺系統 。所以,借這次機會,嘗試用大白話和大家聊聊 Redis 秒殺系統的設計與實現,。
說起 “秒殺”,我相信大家肯定都耳熟能詳了,雙十一零點搶購、手機整點搶購、搶火車票、1 元秒殺、搶紅包等等,都可以說是秒殺的各種應用場景了 。
秒殺系統的設計,難就難在,在極短的時間內,應對瞬時涌入平時成百上千倍的巨大流量,還包括各種攻擊刷量作弊等未知流量,最終我們要保證在用戶體驗順暢良好的情況下,不能多賣或者少賣 。
而當我們公司決定要做秒殺系統的時候,我就去找業務,到時大概會有多少 UV,不知道 10 倍或者 100 倍?然后去找老板,給技術多少預算,最多平時的 10 倍不能再多了,當然越少越好,呵呵,也就是說讓我們用平時最多 10 倍的預算去解決不可預估的用戶流量,怎么做?要是有錢直接扔 1 萬臺服務器跑去吧,錢能解決的事就不是事,但問題是現在還沒那么多錢,還要把事情搞定 。
在聊秒殺系統設計之前,讓我們先回到現實生活中,聊聊常見的“秒殺”場景和秒殺場景的獨有特點,以及它們都是怎么應對的,在應對過程中都需要注意什么 。
日常生活中,其實也有很多秒殺場景,比如,早上 9 點超市開門,老大爺老大媽搶購蔬菜水果,是不是? 還有,新樓盤開盤搶購,是不是? 股市開盤、交易所現場,是不是?
對的,生活中其實有太多類似場景了,你有沒有發現“秒殺”的獨有特點呢?
記住了上面三個特點,我們就可以區分和確定秒殺的業務場景了 。這里我舉一個特別的例子,你說擠公交車,算不算秒殺場景呢?
下面,我再和大家聊一個關于搶豬肉的故事 。
在保安部門充分討論之后,保安大隊長決定通過以下安排,在保證人員安全的前提下,還要做到相對公平 。
后來,活動井然有序的開始了,但是由于豬肉銷售場地太遠,銷售窗口又少,老大爺和老大媽們買肉又精挑細選,導致整個過程很漫長,而且外面等候的人們都開始騷動起來,這個時候保安大隊長趕緊找到經理:
故事講完了,如果我們把上面的故事,理解為秒殺業務場景,我們就可以總結出一個 秒殺系統的設計原則 了:
淘寶運營計劃書怎么寫應該是剛接觸這一行吧,運營計劃很多,有每日計劃、周計劃、月計劃、季度計劃、年計劃,看你要寫的是什么了 。日計劃就是每天的詳細工作情況;周計劃就是一個周的,可以適當加大目標,然后下個周調整;月計劃更大些,目標放長遠;季度和年計劃在此基礎上增加 。給你幾點思路 。
1、對產品的認知、一個運營,需要認識產品,并且不僅僅是自己的產品,競爭對手的產品也要去熟悉、多看人家的詳情、賣點、文案、標題、買家評價這些東西,自己挖掘優劣,然后回頭優化自己的產品 。
2、穩定的流量,淘寶賣東西,流量為王,不管是鉆展、直通車、淘寶客還是老客戶、或者其他手段,你都要讓你的店鋪流量保持平穩然后增長,不然沒有起色 。
3、看得見并且能操作可實現的未來,比如你現在店鋪月成交額是50萬,計劃中下月成交額到70萬,那么這多出來的20萬在什么地方,是流量的提升,還是轉化率增加,或者是客單價的提高,通過什么方法和手段來達到這個效果,要怎么樣操作,你都要詳細的羅列好 。
4、和公司的協同效應,一個運營,你再牛,沒有客服的積極響應、沒有發貨的及時送出、沒有庫存的支撐、沒有老板的資金支持,一切都是空談,要保證KPI,就得保證整個公司協同起來,你要學會掌控這一切,也可以寫入計劃中 。
5、強有力的操作手段,不管你是鉆展,直通車還是淘寶客、或者試客等,你接手了一個店鋪,就要帶來實際的效果,不然老板花錢請你干嘛 。所以你要有自己的手段和能力,保證公司在自己的運營下至少穩定發展 。
下班了,就打這些吧,歡迎交流 。
高并發,你真的理解透徹了嗎?
高并發,幾乎是每個程序員都想擁有的經驗 。原因很簡單:隨著流量變大,會遇到各種各樣的技術問題,比如接口響應超時、CPU load升高、GC頻繁、死鎖、大數據量存儲等等,這些問題能推動我們在技術深度上不斷精進 。
在過往的面試中,如果候選人做過高并發的項目,我通常會讓對方談談對于高并發的理解,但是能系統性地回答好此問題的人并不多 。
大概分成這樣幾類:
1、對數據化的指標沒有概念 :不清楚選擇什么樣的指標來衡量高并發系統?分不清并發量和QPS,甚至不知道自己系統的總用戶量、活躍用戶量,平峰和高峰時的QPS和TPS等關鍵數據 。
3、理解片面,把高并發設計等同于性能優化 :大談并發編程、多級緩存、異步化、水平擴容,卻忽視高可用設計、服務治理和運維保障 。
4、掌握大方案,卻忽視最基本的東西 :能講清楚垂直分層、水平分區、緩存等大思路,卻沒意識去分析數據結構是否合理,算法是否高效,沒想過從最根本的IO和計算兩個維度去做細節優化 。
這篇文章,我想結合自己的高并發項目經驗,系統性地總結下高并發需要掌握的知識和實踐思路,希望對你有所幫助 。內容分成以下3個部分:
高并發意味著大流量,需要運用技術手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩地被系統所處理,帶給用戶更好的體驗 。
我們常見的高并發場景有:淘寶的雙11、春運時的搶票、微博大V的熱點新聞等 。除了這些典型事情,每秒幾十萬請求的秒殺系統、每天千萬級的訂單系統、每天億級日活的信息流系統等,都可以歸為高并發 。
很顯然,上面談到的高并發場景,并發量各不相同,那到底多大并發才算高并發呢?
1、不能只看數字,要看具體的業務場景 。不能說10W QPS的秒殺是高并發,而1W QPS的信息流就不是高并發 。信息流場景涉及復雜的推薦模型和各種人工策略,它的業務邏輯可能比秒殺場景復雜10倍不止 。因此,不在同一個維度,沒有任何比較意義 。
2、業務都是從0到1做起來的,并發量和QPS只是參考指標,最重要的是:在業務量逐漸變成原來的10倍、100倍的過程中,你是否用到了高并發的處理方法去演進你的系統,從架構設計、編碼實現、甚至產品方案等維度去預防和解決高并發引起的問題?而不是一味的升級硬件、加機器做水平擴展 。
此外,各個高并發場景的業務特點完全不同:有讀多寫少的信息流場景、有讀多寫多的交易場景,那是否有通用的技術方案解決不同場景的高并發問題呢?
我覺得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過程中,細節上還會有無數的坑 。另外,由于軟硬件環境、技術棧、以及產品邏輯都沒法做到完全一致,這些都會導致同樣的業務場景,就算用相同的技術方案也會面臨不同的問題,這些坑還得一個個趟 。
因此,這篇文章我會將重點放在基礎知識、通用思路、和我曾經實踐過的有效經驗上,希望讓你對高并發有更深的理解 。
先搞清楚高并發系統設計的目標,在此基礎上再討論設計方案和實踐經驗才有意義和針對性 。
高并發絕不意味著只追求高性能,這是很多人片面的理解 。從宏觀角度看,高并發系統設計的目標有三個:高性能、高可用,以及高可擴展 。
1、高性能:性能體現了系統的并行處理能力,在有限的硬件投入下,提高性能意味著節省成本 。同時,性能也反映了用戶體驗,響應時間分別是100毫秒和1秒,給用戶的感受是完全不同的 。
2、高可用:表示系統可以正常服務的時間 。一個全年不停機、無故障;另一個隔三差五出線上事故、宕機,用戶肯定選擇前者 。另外,如果系統只能做到90%可用,也會大大拖累業務 。
3、高擴展:表示系統的擴展能力,流量高峰時能否在短時間內完成擴容,更平穩地承接峰值流量,比如雙11活動、明星離婚等熱點事件 。
這3個目標是需要通盤考慮的,因為它們互相關聯、甚至也會相互影響 。
比如說:考慮系統的擴展能力,你會將服務設計成無狀態的,這種集群設計保證了高擴展性,其實也間接提升了系統的性能和可用性 。
再比如說:為了保證可用性,通常會對服務接口進行超時設置,以防大量線程阻塞在慢請求上造成系統雪崩,那超時時間設置成多少合理呢?一般,我們會參考依賴服務的性能表現進行設置 。
再從微觀角度來看,高性能、高可用和高擴展又有哪些具體的指標來衡量?為什么會選擇這些指標呢?
2.2.1 性能指標
通過性能指標可以度量目前存在的性能問題,同時作為性能優化的評估依據 。一般來說,會采用一段時間內的接口響應時間作為指標 。
1、平均響應時間:最常用,但是缺陷很明顯,對于慢請求不敏感 。比如1萬次請求,其中9900次是1ms,100次是100ms,則平均響應時間為1.99ms,雖然平均耗時僅增加了0.99ms,但是1%請求的響應時間已經增加了100倍 。
2、TP90、TP99等分位值:將響應時間按照從小到大排序,TP90表示排在第90分位的響應時間,分位值越大,對慢請求越敏感 。
3、吞吐量:和響應時間呈反比,比如響應時間是1ms,則吞吐量為每秒1000次 。
通常,設定性能目標時會兼顧吞吐量和響應時間,比如這樣表述:在每秒1萬次請求下,AVG控制在50ms以下,TP99控制在100ms以下 。對于高并發系統,AVG和TP分位值必須同時要考慮 。
另外,從用戶體驗角度來看,200毫秒被認為是第一個分界點,用戶感覺不到延遲,1秒是第二個分界點,用戶能感受到延遲,但是可以接受 。
因此,對于一個 健康 的高并發系統,TP99應該控制在200毫秒以內,TP999或者TP9999應該控制在1秒以內 。
2.2.2 可用性指標
高可用性是指系統具有較高的無故障運行能力,可用性 = 正常運行時間 / 系統總運行時間,一般使用幾個9來描述系統的可用性 。
對于高并發系統來說,最基本的要求是:保證3個9或者4個9 。原因很簡單,如果你只能做到2個9,意味著有1%的故障時間,像一些大公司每年動輒千億以上的GMV或者收入,1%就是10億級別的業務影響 。
2.2.3 可擴展性指標
面對突發流量,不可能臨時改造架構,最快的方式就是增加機器來線性提高系統的處理能力 。
對于業務集群或者基礎組件來說,擴展性 = 性能提升比例 / 機器增加比例,理想的擴展能力是:資源增加幾倍,性能提升幾倍 。通常來說,擴展能力要維持在70%以上 。
但是從高并發系統的整體架構角度來看,擴展的目標不僅僅是把服務設計成無狀態就行了,因為當流量增加10倍,業務服務可以快速擴容10倍,但是數據庫可能就成為了新的瓶頸 。
像MySQL這種有狀態的存儲服務通常是擴展的技術難點,如果架構上沒提前做好規劃(垂直和水平拆分),就會涉及到大量數據的遷移 。
因此,高擴展性需要考慮:服務集群、數據庫、緩存和消息隊列等中間件、負載均衡、帶寬、依賴的第三方等,當并發達到某一個量級后,上述每個因素都可能成為擴展的瓶頸點 。
了解了高并發設計的3大目標后,再系統性總結下高并發的設計方案,會從以下兩部分展開:先總結下通用的設計方法,然后再圍繞高性能、高可用、高擴展分別給出具體的實踐方案 。
通用的設計方法主要是從「縱向」和「橫向」兩個維度出發,俗稱高并發處理的兩板斧:縱向擴展和橫向擴展 。
3.1.1 縱向擴展(scale-up)
它的目標是提升單機的處理能力,方案又包括:
1、提升單機的硬件性能:通過增加內存、 CPU核數、存儲容量、或者將磁盤 升級成SSD 等堆硬件的方式來提升 。
2、提升單機的軟件性能:使用緩存減少IO次數,使用并發或者異步的方式增加吞吐量 。
3.1.2 橫向擴展(scale-out)
因為單機性能總會存在極限,所以最終還需要引入橫向擴展,通過集群部署以進一步提高并發處理能力,又包括以下2個方向:
1、做好分層架構:這是橫向擴展的提前,因為高并發系統往往業務復雜,通過分層處理可以簡化復雜問題,更容易做到橫向擴展 。
上面這種圖是互聯網最常見的分層架構,當然真實的高并發系統架構會在此基礎上進一步完善 。比如會做動靜分離并引入CDN,反向代理層可以是LVS+Nginx,Web層可以是統一的API網關,業務服務層可進一步按垂直業務做微服務化,存儲層可以是各種異構數據庫 。
2、各層進行水平擴展:無狀態水平擴容,有狀態做分片路由 。業務集群通常能設計成無狀態的,而數據庫和緩存往往是有狀態的,因此需要設計分區鍵做好存儲分片,當然也可以通過主從同步、讀寫分離的方案提升讀性能 。
下面再結合我的個人經驗,針對高性能、高可用、高擴展3個方面,總結下可落地的實踐方案 。
3.2.1 高性能的實踐方案
1、集群部署,通過負載均衡減輕單機壓力 。
2、多級緩存,包括靜態數據使用CDN、本地緩存、分布式緩存等,以及對緩存場景中的熱點key、緩存穿透、緩存并發、數據一致性等問題的處理 。
3、分庫分表和索引優化,以及借助搜索引擎解決復雜查詢問題 。
4、考慮NoSQL數據庫的使用,比如HBase、TiDB等,但是團隊必須熟悉這些組件,且有較強的運維能力 。
5、異步化,將次要流程通過多線程、MQ、甚至延時任務進行異步處理 。
6、限流,需要先考慮業務是否允許限流(比如秒殺場景是允許的),包括前端限流、Nginx接入層的限流、服務端的限流 。
7、對流量進行 削峰填谷,通過 MQ承接流量 。
8、并發處理,通過多線程將串行邏輯并行化 。
9、預計算,比如搶紅包場景,可以提前計算好紅包金額緩存起來,發紅包時直接使用即可 。
10、 緩存預熱,通過異步 任務 提前 預熱數據到本地緩存或者分布式緩存中 。
11、減少IO次數,比如數據庫和緩存的批量讀寫、RPC的批量接口支持、或者通過冗余數據的方式干掉RPC調用 。
12、減少IO時的數據包大小,包括采用輕量級的通信協議、合適的數據結構、去掉接口中的多余字段、減少緩存key的大小、壓縮緩存value等 。
13、程序邏輯優化,比如將大概率阻斷執行流程的判斷邏輯前置、For循環的計算邏輯優化,或者采用更高效的算法 。
14、各種池化技術的使用和池大小的設置,包括HTTP請求池、線程池(考慮CPU密集型還是IO密集型設置核心參數)、數據庫和Redis連接池等 。
15、JVM優化,包括新生代和老年代的大小、GC算法的選擇等,盡可能減少GC頻率和耗時 。
16、鎖選擇,讀多寫少的場景用樂觀鎖,或者考慮通過分段鎖的方式減少鎖沖突 。
上述方案無外乎從計算和 IO 兩個維度考慮所有可能的優化點,需要有配套的監控系統實時了解當前的性能表現,并支撐你進行性能瓶頸分析,然后再遵循二八原則,抓主要矛盾進行優化 。
3.2.2 高可用的實踐方案
1、對等節點的故障轉移,Nginx和服務治理框架均支持一個節點失敗后訪問另一個節點 。
2、非對等節點的故障轉移,通過心跳檢測并實施主備切換(比如redis的哨兵模式或者集群模式、MySQL的主從切換等) 。
3、接口層面的超時設置、重試策略和冪等設計 。
4、降級處理:保證核心服務,犧牲非核心服務,必要時進行熔斷;或者核心鏈路出問題時,有備選鏈路 。
5、限流處理:對超過系統處理能力的請求直接拒絕或者返回錯誤碼 。
6、MQ場景的消息可靠性保證,包括producer端的重試機制、broker側的持久化、consumer端的ack機制等 。
7、灰度發布,能支持按機器維度進行小流量部署,觀察系統日志和業務指標,等運行平穩后再推全量 。
8、監控報警:全方位的監控體系,包括最基礎的CPU、內存、磁盤、網絡的監控,以及Web服務器、JVM、數據庫、各類中間件的監控和業務指標的監控 。
9、災備演練:類似當前的“混沌工程”,對系統進行一些破壞性手段,觀察局部故障是否會引起可用性問題 。
高可用的方案主要從冗余、取舍、系統運維3個方向考慮,同時需要有配套的值班機制和故障處理流程,當出現線上問題時,可及時跟進處理 。
3.2.3 高擴展的實踐方案
1、合理的分層架構:比如上面談到的互聯網最常見的分層架構,另外還能進一步按照數據訪問層、業務邏輯層對微服務做更細粒度的分層(但是需要評估性能,會存在網絡多一跳的情況) 。
2、存儲層的拆分:按照業務維度做垂直拆分、按照數據特征維度進一步做水平拆分(分庫分表) 。
3、業務層的拆分:最常見的是按照業務維度拆(比如電商場景的商品服務、訂單服務等),也可以按照核心接口和非核心接口拆,還可以按照請求源拆(比如To C和To B,APP和H5 ) 。
高并發確實是一個復雜且系統性的問題,由于篇幅有限,諸如分布式Trace、全鏈路壓測、柔性事務都是要考慮的技術點 。另外,如果業務場景不同,高并發的落地方案也會存在差異,但是總體的設計思路和可借鑒的方案基本類似 。
高并發設計同樣要秉承架構設計的3個原則:簡單、合適和演進 。"過早的優化是萬惡之源",不能脫離業務的實際情況,更不要過度設計,合適的方案就是最完美的 。
作者簡介:985碩士,前亞馬遜工程師,現大廠技術管理者 。
【官方出品!揭秘阿里巴巴APP 8.0 視覺品牌升級背后的設計思路 京東搶購秒殺軟件】關于秒殺系統設計思路和京東搶購秒殺軟件的內容就分享到這兒!更多實用知識經驗,盡在 m.apearl.cn
- 索尼中國官網上面訂購是真的嗎 sony官方
- 淘寶的官方活動有哪些 淘寶活動話術
- 黑鯊手機官方旗艦店,黑鯊最新款手機
- 菲莎妮絲是哪里的,菲莎妮絲官方網站
- 封神榜國際版官方網站裝備層次,封神榜國際版手機版
- 雅思蘭黛官方網站美國,雅思蘭黛 官網
- 墨西哥的地理位置及官方語言 墨西哥亞馬遜官方網站
- 京東官方電話人工服務時間,京東官方電話有錄音嗎
- 美菱冰箱網址,美菱冰柜官方網站
- 京東的官方網址是什么 京東網官網自營店
