孫景玉,孫 浩,高婷玉,秦雯波,陳虹云
(南通理工學院 江蘇 南通 226000)
隨著電子商務的普及,人們的購物方式、消費方式和生活方式發生了翻天覆地的改變,手機或是電腦可以隨時隨地使用互聯網,電子商務交易量也因此翻了幾倍。而電商平臺通過跨地域的低價銷售模式,在交易的過程中提供專業服務,不僅有效地降低了成本,還吸引了大量的客戶[1]。各大電商平臺所推出的秒殺活動更是以低廉的價格、有限的商品和超短的銷售時間吸引消費者的注意,無形中增加顧客的購買欲望,如廣為熟知的淘寶、京東、拼多多等大型電商平臺,為了提高客戶的體驗,增強平臺的高可用性,吸收新用戶、提高收益率,推出低價的“秒殺”業務,短時間內為電商平臺帶來巨大流量以及消費收益,因此秒殺活動越來越受電商平臺的重視。但是,電商平臺的秒殺系統需要面對短時間內激增的流量壓力、網絡作弊(如秒殺機器人)和線程超賣等問題[2]。對于大型電商企業而言,由于自身資金雄厚,可以選擇自主研發文件存儲系統、緩存系統以及負載均衡系統,投入大量人力、物力和財力,從軟件、硬件各個方面去解決這些問題。對于中小型電商平臺來說,在面對限時促銷、秒殺等這些高并發場景的時候,如果不對系統做出性能優化處理,那么系統就會輕而易舉地陷入異常狀態,從而造成收益損失[3]。
由此看來,高效準確地處理高并發請求,優化用戶使用體驗,并且向客戶提供專業、可靠以及準確的服務,是目前各大電商平臺亟待解決的問題。
鑒于此,文章從現實需求出發,通過研究秒殺活動的高并發以及線程超賣等問題,對秒殺進行性能優化,設計出高性能的秒殺系統。文章采用以下關鍵技術:
為了提高頁面的響應速度,以及讓系統能夠適應高并發的場景,需要設計使用緩存方案。頁面優化方面主要使用頁面緩存+URL緩存+對象緩存。開發的瓶頸在于數據庫,需要想辦法減少對數據庫的訪問,所以需要使用緩存,通過各種不同粒度的緩存細化方案,提高響應速度。此外可以讓頁面靜態化,將HTML緩存到客戶端。Redis是一個基于內存操作、運行速度非常快、讀寫性能極高的非關系型數據庫,可以存儲鍵(key)與多種值(value)之間的映射,支持多種數據結構的存儲如list、set、zset、hash等[4]。Redis的強大之處就是它具有極高的讀寫性能,根據官方資料顯示,讀取的速度可達110 000次/s,寫的速度可達81 000次/s。同時,Redis的所有操作都是原子性的,要么全部執行成功,要么失敗回滾[5]。單個操作是原子性的,多個操作也支持事務,并且完全開源免費。
為了解決不同業務流程之間的通信,引入了第三方消息中間件,實現系統的異步下單、流量削峰,提高系統響應速度和運行效率,進一步提高用戶體驗感。消息中間件是基于隊列與消息傳遞技術,在網絡環境中為應用系統提供異步、可靠的消息傳輸的支撐性軟件系統[6]。本系統使用的是RabbitMQ作為第三方消息中間件,整合SpringBoot框架,具有一定的獨立性,RabbitMQ也是市面上比較流行的一款消息中間件,是基于AMQP協議的開源消息中間件,具有很好的穩定性、數據一致性以及可靠性,整合SpringBoot框架開發后,可以非常方便地面向消息中間件進行對應的開發。
采用當前互聯網公司常用的前后端分離協作的開發方式,結合主流的SpringBoot、Mybatis、SpringMVC輕量級的膠水框架,實現系統前、后端的分別開發。針對Spring缺點進行改善和優化,遵循約定大于配置的思想,讓開發者不再需要在業務邏輯和配置之間進行思維的切換,可以專心于業務邏輯的編寫,從而大大提高開發的效率[7-8]。
用戶以及商家信息數據的安全對于電商系統來說是個極其重要的問題。如果系統安全問題不能保證,就會給用戶以及商家帶來不必要的損失,通過隱藏秒殺接口地址,秒殺接口防刷限流等一系列操作來對系統進行安全優化,防止非法用戶闖入以及非法請求破壞系統,造成不可挽回的損失。同時使用MD5進行二次加密,第一次加密用戶密碼,第二次采用密碼“加鹽”,也就是在加密完密碼之后,在密碼的不同位置插入不同的值,再進行一次MD5加密,確保用戶信息安全。
電商秒殺系統包括秒殺商城前臺系統以及電商后臺管理系統。使用角色是參與秒殺活動的用戶以及商城后臺的管理員。對于秒殺商城前臺系統,不但要實用、操作簡便,以方便用戶使用,還要可以滿足高并發場景下的秒殺業務需求,防止數據庫宕機或者線程超賣,給商家以及平臺帶來損失。而電商后臺管理系統,是針對商城管理人員所設計的,主要用于對用戶信息、商品信息、秒殺商品以及訂單信息的管理。通過后臺管理系統可以實現商家對店鋪的管理,直觀地體現出每日訂單量、總銷售量以及用戶量,能夠更好地協助管理者對商城的管理。
針對秒殺問題的解決方案,文章設計并實現一款電商秒殺系統進行驗證。系統分為秒殺前臺系統和管理后臺系統。秒殺前臺系統的主要功能包括登錄、瀏覽商品、查看商品詳細信息(包含秒殺功能)、生成訂單、支付訂單。后臺管理系統的功能包括商品管理、秒殺商品管理、秒殺用戶管理、秒殺訂單管理、管理員管理等。系統功能結構設計圖如圖1、圖2所示。

圖1 用戶端功能設計圖

圖2 管理端功能設計圖
(1)注冊、登錄。通過輸入用戶名(手機號)、密碼,進行登錄。若沒有賬號,則需要到注冊界面輸入手機號碼、密碼以及確認密碼進行注冊,注冊成功后再去登錄。
(2)商品瀏覽。展示參與秒殺活動的商品信息,包括商品名稱、商品圖片和商品價格、秒殺價格和商品庫存。
(3)秒殺商品詳情。商品詳情頁面可以展示商品名稱、商品圖片、秒殺開始時間、秒殺狀態(未開始/進行中/已結束)、商品原價、秒殺價格、庫存數量、驗證碼以及秒殺按鈕。秒殺流程圖如圖3所示。

圖3 秒殺流程圖
(4)訂單詳情。主要展示訂單的信息,包括商品名稱、商品圖片、訂單原價、下單時間、訂單狀態、收貨人、收貨地址。
(1)管理員登錄/退出。
(2)商品管理。管理員可以對商城的商品進行操作,可以增加商品、修改商品信息、刪除商品、查詢商品。
(3)用戶管理。管理員可以查看用戶列表,可以查看到用戶的手機號、用戶名、最近一次的登錄時間、登錄次數以及用戶狀態。管理員也可以修改用戶的信息、可以根據用戶的手機號搜索用戶。
(4)秒殺管理。管理員可以添加參與秒殺活動的商品,或者刪除已經秒殺結束的商品。可以對秒殺商品的信息進行修改,對秒殺商品進行查詢。
(5)訂單管理。管理員可以對訂單信息、秒殺訂單信息進行修改,也可以根據手機號查詢用戶的訂單。
(6)銷售統計。管理員登錄后在控制臺可以查看銷售總額、訂單總數、用戶數量。
當軟件開發到一定程度時,要對其自身性能進行測試,從而有效發現軟件中存有的缺陷,使軟件產品自身品質得到有效提升,并對其功能進行不斷完善[9]。性能測試主要基于靜態與動態資源的程序,如靜態資源文件、Servlet JAVA對象、數據庫、FTP服務器等[10]。文章使用Jmeter工具對電商秒殺系統的秒殺接口進行壓力測試,分別記錄沒做優化之前與做了優化之后秒殺接口的QPS(吞吐量)。步驟如下:
(1)生成腳本。編寫JAVA代碼使用JDBC的方式連接數據庫,生成對應數據,添加線程組基于對性能測試用例的分析數據。
(2)創建線程組,設置線程數。新建一個線程組,設置線程數為1 000,循環次數10次。
(3)添加HTTP請求,添加聚合報告。依次選擇添加、取樣器、HTTP請求,并且添加一個聚合報告來查看系統QPS(吞吐量)。
(4)新建CSV Data,導入腳本。選擇新建CSV Data選項,將錄制好的腳本token.txt導入,點擊開始,完成之后可以查看聚合報告。
秒殺詳情界面如圖4所示,性能測試得出的聚合報告如圖5、圖6所示。

圖5 未優化前的結果

圖6 優化后的結果
對比兩次壓測結果可以看出優化后吞吐量明顯提升,系統的抗并發能力明顯提高。
文章研究了秒殺活動的高并發場景特點,提出了基于Redis的緩存方案,對秒殺接口進行優化、頁面靜態化以及簡化數據庫設計,設計出了高性能的秒殺系統。不僅讓電商系統可以承受住秒殺活動所帶來的高并發量,同時還能解決線程超賣問題、訪問超時、服務癱瘓等問題,有效地維護商家利益,進而讓用戶擁有更好的購物體驗。