新聞中心
一 百萬并發(fā)秒殺概述
1.1 可能遇到問題
在一瞬間服務出現(xiàn)大量請求,服務可能會崩潰。

創(chuàng)新互聯(lián)公司,是一家集策劃、設計、技術開發(fā)一體的專業(yè)互聯(lián)網產品服務公司,致力于為企業(yè)信息化提供驅動力。技術團隊10多年來致力于為客戶提供企業(yè)網站定制,手機網站開發(fā)。先后服務了千余家客戶,包括各類中小企業(yè)、高校、政府。 創(chuàng)新互聯(lián)公司將利用公司在過去10多年的資源積累,力爭為客戶打造真正革命性的口碑產品!
在秒殺商品時候,可能出現(xiàn)超賣。
1.2 秒殺的業(yè)務流程
秒殺的商品有熱點商品和非熱點商品,熱點商品可能流量占整個的90%.
后臺商品管理可以將商品加入到秒殺商品,根據商品訪問量分位熱點商品和非熱點商品。
用戶搶到商品支付,發(fā)貨商品。超時不付款,訂單取消。
二 秒殺架構
秒殺系統(tǒng)架構圖
- 我們Java項目時用tomcat部署的。nginx的并發(fā)量能達到五萬,tomcat最優(yōu)能支持1千。所以首要問題就是讓tomcat直接處理請求,減少tomcat處理請求。由于商品的詳情頁除了數量其他基本不改變。因此可以采用詳情頁放到nginx緩存中。還有就是考慮熱點商品的搶購能直接經過nginx處理不到服務端,這樣就完美解決了問題了。
Lua腳本對JWT校驗:
用戶請求到達nginx,用lua腳本進行jwt校驗,減少非法請求對服務器的訪問。從而減少服務器壓力。
2.1 靜態(tài)頁面處理
- 因為秒殺商品的瀏覽量很高,而且商品的描述,價格,圖片,標題基本上是不變的。因此考慮用freemarker做商品靜態(tài)化。所以先考慮靜態(tài)頁面的生成,商品數量發(fā)生改變靜態(tài)頁面從新生成。
1. 后臺將設置商品成為秒殺商品流程:
- 比如京東的秒殺都是一個時間點到另外一個時間點。當秒殺的時間點到了,需要從索引庫中刪除對應索引和刪除對應的靜態(tài)頁面。我們可以在商品添加秒殺時候,設置定時任務。然后定時任務到達后執(zhí)行對應操作。在添加秒殺時候,更改數據庫中商品是處于秒殺,然后生成靜態(tài)頁面。
2. 商品數量修改,靜態(tài)頁面的同步(canal數據同步):
- 使用canal對數據庫的表進行監(jiān)控時候,當新增,刪除,編輯表中是數據時候,canal都能監(jiān)控到。從而觸發(fā)canal書寫的Java服務,然后根據業(yè)務進行靜態(tài)頁面的修改。
3. 靜態(tài)頁面的生成和刪除:
- 當商品變成秒殺商品,生成靜態(tài)頁面。當商品賣完或者變?yōu)槠胀ㄉ唐?,刪除靜態(tài)頁面。
2.3 將秒殺熱點數據隔離
- 我們可以根據商品的瀏覽量判定當前商品是否位熱點數據。所以需要商品瀏覽記錄收集,和收集瀏覽記錄的分析。
2.3.1 日志收集
用戶訪問商品詳情,首先請求經過nginx,然后使用nginx和lua腳本對請求商品詳情路徑進行攔截,然后將請求商品數據發(fā)送到kafka。數據庫接受到kafka數據,完成商品瀏覽數據收集。
2.3.2 數據分析
Apache Druid訂閱Kafka從而獲取商品的訪問日志,druid能實時獲取商品訪問記錄。druid支持sql,對數據進行分析。找出熱點數據。
- # lua腳本發(fā)送給kafka日志格式
- {
- "actime": "2020‐4‐10 9:50:30",
- "uri": "http://192.168.211.137/items/S1235433012716498944.html",
- "ip": "119.123.33.231",
- "token": "Bearer ITHEIMAOOPJAVAITCAST"
- }
2.3.3 熱點數據隔離
可以采用定時任務(elastic-job)實時查詢Druid,把近期訪問量最多的商品放入redis緩存中。緩存中數據如下:商品庫存,價格,名稱等。
備注:
用戶進行下單時候,在redis中就是熱點商品,走熱點下單。不在redis中不是熱點商品,走服務直接下單。
在將熱點商品放到redis中,需要根據商品的鎖定字段,將商品鎖定。然后再將商品信息放到redis中。用戶搶購商品和熱點商品放到redis中同時進行,導致庫存混亂。
2.4 熱點商品和非熱點商品搶購流程
需要判斷當前用戶對當前商品24小時內是否搶過。判斷搶購商品是冷商品還是熱門商品。判斷庫存是否充足。
1. 非熱點商品秒殺:
- a 判定為非熱點數據,進入服務中進行下單系統(tǒng)。
- b 對庫存進行判斷,如果庫存充足,進行下單。如果庫存不充足,事務回滾。
- c 如果庫存充足,但是商品變?yōu)闊狳c商品。應將下單操作發(fā)送到kafka,然后變成熱點商品下單操作(防止商品庫存混亂)。
- d 記錄該用戶搶的該商品,用于提示該用戶24小時不能搶該商品。
2. 熱點商品秒殺:
- a lua腳本進行JWT校驗,判斷用戶是否登錄。
- b 從redis查詢看該用戶是否搶了該商品(在搶購商品成功后,會將商品和用戶信息存儲到redis中)。
- c 從redis熱點商品中查詢,商品是否為熱點商品。如果是熱點商品且?guī)齑?0,熱點商品搶購流程。
- d 判斷該用戶該商品是否處于排隊(用redis的incr自增來判斷當前用戶該商品是否重復排隊)。是,提示用戶正在排隊。否,直接排隊。e 訂單系統(tǒng)通過隊列訂閱讀取用戶下單信息,并進行下單。
三 流量監(jiān)控
在秒殺項目中需要集成Sentinel進行限流操作。在秒殺過程中冷門商品變?yōu)闊衢T商品時候,訪問服務流量瞬間激增,需要采用Sentinel進行限流,保護服務的穩(wěn)定性。
名稱欄目:100W并發(fā)秒殺系統(tǒng)架構
分享URL:http://fisionsoft.com.cn/article/ccejhsp.html


咨詢
建站咨詢
