亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種高并發(fā)電商秒殺系統(tǒng)的設計與實現(xiàn)

        2019-03-02 02:35:34劉磊
        現(xiàn)代計算機 2019年2期
        關鍵詞:數(shù)據(jù)庫用戶系統(tǒng)

        劉磊

        (廣東開放大學,廣州 510000)

        1 秒殺業(yè)務分析

        作為現(xiàn)代電商的重要促銷手段,商品秒殺、搶紅包這類“短時間、高并發(fā)”的需求越來越多。一個典型的電商秒殺系統(tǒng)圍繞著商家、庫存、用戶、訂單四者展開[1]。首先,商家會添加、調(diào)整商品庫存,庫存則會反映商家的發(fā)貨、核帳信息;用戶成功秒殺商品,庫存進行減法操作,同時用戶訂單進行加法操作,插入一條秒殺記錄明細;用戶的付款、退貨行為,也會反映在庫存和訂單。秒殺系統(tǒng)處理的是大量用戶瞬時對有限商品的激烈競爭,它的高并發(fā)點出在前端用戶秒殺商品環(huán)節(jié),其核心是庫存的高效處理。

        用戶每個成功的秒殺行為都包括兩個動作:減去商品庫存和記錄購買明細,業(yè)務要求這兩個動作必須同時成功,若減庫存而沒有記錄購買明細就會出現(xiàn)超賣,記錄了明細卻沒有減庫存就出現(xiàn)了少賣,這兩種現(xiàn)象都是不正常的。因此,減庫存與記明細這兩個原子操作要么都成功,要么都不成功,它們組成了一個完整的事務,秒殺業(yè)務場景具有典型的“事務”特性,如圖1所示。要保證以上操作數(shù)據(jù)順利存儲,有兩種方案:使用RDBMS(關系型數(shù)據(jù)庫)或使用NoSQL(非關系型數(shù)據(jù)庫),NoSQL的重要場景在緩存,對事務支持較差;RDBMS支持魯棒性事務,業(yè)界研究表明,事務機制依然是目前最可靠的數(shù)據(jù)落地方案[2-3]。

        圖1 秒殺的事務特性

        2 系統(tǒng)設計

        2.1 功能設計

        為著重驗證秒殺功能,筆者設計了一個業(yè)務具有典型性的秒殺系統(tǒng)[4],功能設計如下:

        (1)用戶注冊登錄:用戶注冊賬號,使用賬號登錄系統(tǒng)。

        (2)秒殺列表查詢:以列表形式展示秒殺商品。

        (3)秒殺詳情查詢:以單頁面展示秒殺商品詳細信息,包括秒殺倒計時、秒殺按鈕。

        (4)生成秒殺地址:為了避免用戶作弊,即秒殺開啟前提前在瀏覽器輸入秒殺地址進入秒殺,設計只有在秒殺開始時才能暴露秒殺地址,使用MD5加鹽加密生成地址,防止用戶撞庫破解。

        (5)執(zhí)行秒殺:系統(tǒng)最核心功能,用戶執(zhí)行秒殺,成功則依次進行減庫存和記錄購買明細兩個動作,同時返回秒殺成功響應給前端用戶,秒殺失敗也返回相應失敗信息。

        (6)用戶中心:以列表形式展示用戶成功秒殺的商品,對接付款模塊,顯示訂單狀態(tài)。

        2.2 數(shù)據(jù)庫設計

        圍繞秒殺業(yè)務和功能分析,本方案數(shù)據(jù)庫設計三個核心實體對象:用戶、商品和訂單。用戶實體記錄注冊登錄信息,用戶ID設置為主鍵;商品實體記錄一件商品的名稱、庫存量、秒殺開始時間和結束時間等庫存詳情,商品ID設置為主鍵;訂單記錄秒殺成功后的明細,即哪個用戶秒殺了哪件商品,當前狀態(tài)是未付款還是已付款。根據(jù)業(yè)務分析,一個用戶可以秒殺多個商品,一個商品也可以被多個用戶秒殺,用戶與商品是多對多的關系,同時秒殺業(yè)務要求同一用戶對同一商品不能重復秒殺,也就是訂單表不能插入用戶ID和商品ID兩者都相同的記錄,解決策略是只需要將商品ID與用戶ID組成訂單表的聯(lián)合主鍵即可。本秒殺系統(tǒng)數(shù)據(jù)庫模型設計如圖2所示。

        圖2 數(shù)據(jù)庫模型圖

        2.3 流程設計

        用戶秒殺商品的典型流程是:①首先,用戶查看所有的秒殺商品列表,點擊選中的秒殺進入商品詳情頁;②詳情頁除了顯示商品名稱、詳情、開始時間、結束時間等“靜態(tài)信息”外,每次加載詳情頁,都要動態(tài)請求服務器標準系統(tǒng)時間,若系統(tǒng)時間小于開始時間,則返回前端提示,頁面使用特效展示秒殺倒計時;③若系統(tǒng)時間大于開始時間并且小于結束時間,則意味著秒殺進行中,系統(tǒng)生成秒殺地址并返回前端顯示秒殺按鈕,用戶需要登錄或提前登錄執(zhí)行秒殺,成功秒殺則后端數(shù)據(jù)庫執(zhí)行減庫存和記明細兩個事務操作,返回前端秒殺結果;④若系統(tǒng)時間大于結束時間,則意味著秒殺結束,返回前端結束信息。用戶在商品詳情頁的交互流程如圖3所示。

        圖3 用戶秒殺流程圖

        3 技術實現(xiàn)

        本系統(tǒng)實現(xiàn)方案采用業(yè)界流行的技術組合:Linux+Tomcat/Nginx+SSM+Bootstrap+MySQL+Redis+Maven,這套組合被阿里、京東等互聯(lián)網(wǎng)公司廣泛應用于大中型Web應用,非常適于開發(fā)高并發(fā)、高性能、高擴展的Web系統(tǒng)。

        (1)SSM:SpringMVC、Spring、MyBatis三大框架的完美組合,主流的J2EE企業(yè)級開發(fā)框架,具有輕量級、代碼侵入性低、技術成熟的特點,支持典型的三層架構:DAO(數(shù)據(jù)層)、Service(業(yè)務層)、Web(表示層)[5]。MyBatis是數(shù)據(jù)層框架,支持定制SQL語句,傳參自由、靈活,結果集自動賦值,接口設計和SQL語句的分離,方便代碼Review。Spring提供了一個統(tǒng)一托管對象的容器工廠,允許通過一致的訪問接口,訪問工廠里的任意實例,也就是對象控制反轉(IoC);Spring還支持聲明式事務,對于高并發(fā)應用,帶事務的方法往往是瓶頸所在,一不小心就可能導致數(shù)據(jù)庫訪問延遲,使用聲明式事務可以方便地開發(fā)單一、純凈的事務方法。SpringMVC是Web層框架,支持RESTful風格的URL和MVC開發(fā)模式。

        (2)Bootstrap:簡潔、直觀、強悍的前端開發(fā)框架,基于 HTML5、CSS3、jQuery技術構建,提供了導航、分頁、面板等可復用的靜態(tài)組件,下拉菜單、標簽頁、彈出框等動態(tài)插件,強大靈活的柵格布局系統(tǒng),使用Bootstrap可以快速、高效地開發(fā)健壯和優(yōu)雅的響應式靜態(tài)頁面[6]。

        (3)MySQL:最流行的用于Web開發(fā)的關系型數(shù)據(jù)庫,支持事務和鎖機制,可以單點、主從復制、集群多種規(guī)模運行,經(jīng)測試,MySQL執(zhí)行同一條update壓力測試約為4萬QPS,即一秒可以賣4萬個商品,能夠頂住大部分秒殺壓力,本方案使用MySQL持久化數(shù)據(jù)[7-8]。

        (4)Redis:基于內(nèi)存的NoSQL型數(shù)據(jù)庫,經(jīng)測試Redis性能非常高,每秒鐘SET操作可執(zhí)行110000次、GET操作可執(zhí)行81000次,本方案使用Redis緩存熱點數(shù)據(jù)[9-11]。

        (5)Maven:強大的項目構建工具,以標準化的方式管理編譯、生成、發(fā)布、文檔等整個項目建設生命周期,提供更佳的項目依賴和持續(xù)集成管理。

        (6)Tomcat/Nginx:Tomcat輕量、穩(wěn)定,用作應用服務器,Nginx具備強大的并發(fā)處理、靈活的反向代理能力,用作負載均衡服務器。

        使用以上技術組合,編碼分為SQL編碼、DAO層編碼、Service層編碼、Web層編碼,系統(tǒng)各層關鍵接口對接情況如表1所示。

        表1 系統(tǒng)關鍵接口對接表

        4 高并發(fā)瓶頸分析及優(yōu)化

        秒殺的本質(zhì)是大量用戶瞬時集中競爭有限的商品,秒殺系統(tǒng)最大的瓶頸點在商品秒殺環(huán)節(jié)。當秒殺開啟時,大量用戶涌入查詢商品詳情頁、同時點擊秒殺按鈕,請求流量瞬間達到高峰,若將所有請求都直接發(fā)送到服務器,將耗損服務器大量響應資源,單臺服務器并發(fā)處理能力有限,嚴重時可能導致服務器宕機,為了保證大量請求的及時處理,使用其他服務器分流依然是最有效的應對策略。

        一個成功的秒殺行為在服務器要執(zhí)行兩個業(yè)務邏輯:減庫存、記明細,反映在數(shù)據(jù)庫層面,這兩個原子操作組成一個事務,要么都提交,要么都不提交,示意代碼如下:

        Start Transaction

        Update減庫存

        Insert記明細

        Commit/Rollback

        大量用戶在有限的時間內(nèi)競爭有限商品,意味著很多用戶同時去執(zhí)行同一個商品ID的減庫存操作(如:update table set num=num-1 where id=1001),但是數(shù)據(jù)庫對同一行數(shù)據(jù)修改是有行級鎖機制的,即一次運行完提交后,下一個才能運行,這就讓很多用戶“堵塞”在update操作,并發(fā)量大時系統(tǒng)響應性能呈指數(shù)級下降,這也是秒殺業(yè)務邏輯的并發(fā)瓶頸所在。對于秒殺系統(tǒng)來說,高并發(fā)優(yōu)化就是疏通“堵塞”、引導“分流”,讓更多人更快通過“瓶頸”參與“競爭”[5-6]。

        針對以上分析提出以下具體優(yōu)化措施[12-13]。

        4.1 使用C C D D N N緩存靜態(tài)化資源

        CDN即內(nèi)容分發(fā)網(wǎng)絡,通過在網(wǎng)絡各處放置節(jié)點服務器構成智能虛擬網(wǎng)絡,能夠實時將用戶請求重定向到響應最快的服務節(jié)點,使用戶就近取得所需內(nèi)容,開發(fā)人員可以自己搭建或租用云CDN服務。商品秒殺詳情頁是并發(fā)請求量最集中的頁面,為減少服務器請求,可將詳情頁里靜態(tài)化的資源剝離出來推送到CDN節(jié)點,例如JavaScript腳本、CSS、圖片等不常變化的資源,也就是在前端緩存靜態(tài)內(nèi)容,這樣一部分請求就被重定向到CDN節(jié)點,如果命中資源就不需訪問后端服務器,減輕了服務器壓力,也提高了響應速度。

        4.2 使用Redis優(yōu)化生成秒殺地址

        詳情頁里有部分資源是不能緩存到CDN節(jié)點的,例如請求服務器標準時間,Java執(zhí)行一次new Date()約只需10ns,因此不會成為瓶頸。請求秒殺地址也不能緩存到CDN,秒殺地址為防止被猜到,是由服務端在秒殺期間動態(tài)生成的,每次查詢詳情頁都要請求一次秒殺地址是否開啟,如果開啟則通過MD5加鹽后再加密生成不可逆的地址字符串發(fā)送到前端,判斷是否開啟需要查詢秒殺商品的開始時間和結束時間,為提高響應速度,可將秒殺商品查詢結果緩存在服務端。本方案選用高性能的Redis用作服務端緩存,方法是首先在Redis查找商品,若找到則直接返回;找不到則查詢數(shù)據(jù)庫,同時緩存一份在Redis。為避免單機故障,也可以做成Redis集群使用。

        4.3 使用存儲過程優(yōu)化行級鎖持有時間

        上面分析出秒殺環(huán)節(jié)的瓶頸點在對同一商品“競爭”執(zhí)行update操作,數(shù)據(jù)庫對一行數(shù)據(jù)執(zhí)行update操作時,會加上行級鎖,此時其他update操作處于等待,等事務提交或回滾后釋放行級鎖,其他update操作才能依次執(zhí)行,而insert操作是可以并發(fā)運行的,也就是行級鎖持有時間阻塞了秒殺進程;Java與MySQL交互,使用Java執(zhí)行SQL語句的耗時,包括SQL語句執(zhí)行耗時、發(fā)送語句到MySQL和返回結果的網(wǎng)絡延遲、GC操作耗時,一次秒殺行為的耗時計算公式為:一次秒殺耗時=update耗時+insert耗時+網(wǎng)絡延遲+GC耗時+其他耗時。所有耗時加起來,秒殺行為的總耗時就變長了,其實Java不慢,MySQL也不慢,但是使用Java操作MySQL,中間耗時浪費,響應就慢了[14-16]。

        因此減少行級鎖的持有時間和降低網(wǎng)絡延遲即可大幅降低一次秒殺耗時,方法是:①將insert調(diào)到update之前運行,insert可以并發(fā)執(zhí)行,若update成功,則可以同時提交,否則,則同時回滾,只有update需要鎖住,性能提升一倍;②將業(yè)務邏輯封裝成存儲過程放在MySQL服務端運行,Java客戶端只需要拿到執(zhí)行結果即可,MySQL本地執(zhí)行存儲過程是很快的,這樣大部分網(wǎng)絡延遲和GC耗時會被消滅掉。行級鎖持有時間優(yōu)化前后對例如圖4所示。

        經(jīng)過多組測試,對同一行數(shù)據(jù)執(zhí)行一次update操作,使用存儲過程事務的行級鎖持有時間大約為6ms,使用Java客戶端托管的事務行級鎖持有時間大約為40ms,相差34ms,這意味者如果有500人同時競爭同一個熱點商品,優(yōu)化后的事務排隊時間可以減少17s(34ms×500)。

        圖4 行級鎖持有時間優(yōu)化

        4.4 使用集群化部署提高系統(tǒng)抗壓能力

        理論上,一臺服務器若能頂住1000的并發(fā)量,兩臺服務器就能頂住2000的并發(fā)量,一般來說,當上線的Web系統(tǒng)并發(fā)量達到一定數(shù)量級時,都可以通過大規(guī)模服務器集群化部署提高系統(tǒng)的抗壓能力,也就是常說的“當一頭牛拉不動時,那就用三頭?!?。本方案設計的系統(tǒng)架構、選用的開發(fā)框架都非常適于以集群的方式運行,對于實際線上的電商秒殺系統(tǒng),通過不斷增加服務器可以快速提高系統(tǒng)的并發(fā)處理能力[17-18]。本系統(tǒng)線上集群化部署可以分為五層:①CDN緩存層:緩存靜態(tài)化資源;②負載均衡層:根據(jù)訪問量,負責將請求智能轉發(fā)到不同服務器;③Web應用層:在Tomcat集群上部署相同的Web應用;④Redis緩存層:緩存數(shù)據(jù)庫查詢結果;⑤數(shù)據(jù)庫存儲層:數(shù)據(jù)落地,使用主從庫同步、讀寫庫分離、分庫分表等技術增強抗壓能力。線上秒殺系統(tǒng)集群化部署方案參考圖5所示。

        圖5 秒殺系統(tǒng)集群化部署方案

        5 測試與應用

        為了測試本文設計的秒殺系統(tǒng)的性能、可用性和并發(fā)處理能力,筆者使用Apache JMeter進行了三組壓力測試,為避免硬件帶來的誤差,三組測試環(huán)境使用了相同的機器配置,統(tǒng)一CPU為Intel Core i5 3.3GHz、內(nèi)存為8GB,網(wǎng)絡環(huán)境為實驗室局域網(wǎng)。三組測試分別為:①測試一使用1臺服務器,MySQL與Tomcat安裝在一起;②測試二使用2臺服務器,1臺安裝Tomcat,1臺安裝MySQL,Web服務器與數(shù)據(jù)庫分開部署;③測試三使用10臺服務器模擬小型集群環(huán)境,2臺安裝Nginx作負載均衡服務器,1臺安裝Nginx作靜態(tài)資源服務器,3臺安裝Tomcat作應用服務器,1臺安裝Redis作緩存服務器,3臺安裝MySQL作數(shù)據(jù)庫服務器。從測試一到測試二再到測試三,不斷增加服務器數(shù)量和并發(fā)數(shù),以驗證系統(tǒng)并發(fā)承載能力,三組測試得到的并發(fā)數(shù)、服務器CPU利用率、平均響應時間如表2-4所示。

        表2 測試一

        表3 測試二

        表4 測試三

        由此可見,通過不斷增加服務器,分層部署系統(tǒng),將請求流量分發(fā)到不同節(jié)點;采取一定的優(yōu)化策略,將靜態(tài)化資源分流,將部分查詢結果緩存,將網(wǎng)絡延遲降至最低。這些措施可有效提高秒殺系統(tǒng)的性能、可用性和并發(fā)處理能力。本方案實現(xiàn)的秒殺系統(tǒng)作為筆者參與的電商平臺核心模塊已經(jīng)上線運行,通過生產(chǎn)環(huán)境中的并發(fā)優(yōu)化和集群化部署,在多次的促銷活動中,頂住了上萬的并發(fā)壓力,表現(xiàn)穩(wěn)定。

        6 結語

        本文設計和實現(xiàn)的電商秒殺系統(tǒng)解決方案,使用SSM框架實現(xiàn)高擴展性,使用MySQL事務機制保證秒殺數(shù)據(jù)完整性,使用Redis緩存提高系統(tǒng)訪問性能,使用集群化部署增強系統(tǒng)并發(fā)處理能力,本方案具有典型性,對于解決秒殺、搶紅包這類“瞬時高并發(fā)搶資源”的需求有較普遍的參考價值,本文沒有更多討論秒殺系統(tǒng)的安全性,有待進一步研究。當然秒殺作為各大電商的促銷手段,其線上實現(xiàn)方案不止一種,也有利用分布式MQ記錄行為消息、再異步數(shù)據(jù)落地或者利用隊列在內(nèi)存中操作的方案,沒有最佳和一勞永逸的方案,只有最適應業(yè)務需求的方案,讀者可以根據(jù)場景靈活選用。

        猜你喜歡
        數(shù)據(jù)庫用戶系統(tǒng)
        Smartflower POP 一體式光伏系統(tǒng)
        WJ-700無人機系統(tǒng)
        ZC系列無人機遙感系統(tǒng)
        北京測繪(2020年12期)2020-12-29 01:33:58
        連通與提升系統(tǒng)的最后一塊拼圖 Audiolab 傲立 M-DAC mini
        數(shù)據(jù)庫
        財經(jīng)(2017年2期)2017-03-10 14:35:35
        關注用戶
        商用汽車(2016年11期)2016-12-19 01:20:16
        關注用戶
        商用汽車(2016年6期)2016-06-29 09:18:54
        數(shù)據(jù)庫
        財經(jīng)(2016年15期)2016-06-03 07:38:02
        關注用戶
        商用汽車(2016年4期)2016-05-09 01:23:12
        數(shù)據(jù)庫
        財經(jīng)(2016年3期)2016-03-07 07:44:46
        日本韩国一区二区高清| 免费一级特黄欧美大片久久网| 亚洲制服无码一区二区三区| 国内精品熟女一区二区| 国产精品一区二区av不卡| 99精品久久精品一区二区| 亚洲精品人成无码中文毛片| 中国精品视频一区二区三区| 亚洲无av码一区二区三区| 插插射啊爱视频日a级| 中文成人无字幕乱码精品区| 国产激情在观看| 国产精品久久一区二区蜜桃| 韩国av一区二区三区不卡| 东北妇女肥胖bbwbbwbbw| 国产亚洲精品A在线无码| 激情偷拍视频一区二区| 三级全黄裸体| 青草国产精品久久久久久| 日本中文字幕一区二区高清在线| 亚洲国产精品激情综合色婷婷| 日本少妇春药特殊按摩3| 成在人线av无码免费| 免费在线观看蜜桃视频| 日本黑人亚洲一区二区| 亚洲码国产精品高潮在线| 国产真人无遮挡免费视频| 亚洲国产精品成人一区二区三区 | 国产精品涩涩涩一区二区三区免费| 最新69国产精品视频| 妺妺窝人体色www聚色窝仙踪| 久久精品国产夜色| 三级黄色片一区二区三区| 日本av一区二区三区视频| 中国丰满熟妇xxxx| 亚洲无码图| 免费毛片性天堂| 色噜噜色哟哟一区二区三区| 欧美国产激情二区三区| 国产亚洲精久久久久久无码77777| 开心五月婷婷综合网站|