限量 30 件的商品一開賣,三分鐘湧進一百張訂單,隔天你打開後台,看到庫存數字是 -8,多賣出去的八單,客服得一個一個打電話道歉、退款、送折價券,店鋪評分還掉了一截。這種情況最容易發生在你開放超商代碼、ATM 轉帳這類晚幾小時才付款的方式。
WooCommerce 預設是付款後才扣庫存,前面一堆人都還沒付,系統看到的庫存數字就一直是「還有貨」,等大家陸續繳費,才一起爆成負數,這種 WooCommerce 超賣的災難,其實在開賣前就測得出來,只是大部分外掛從來沒被這樣測過。
WooCommerce 在單店、庫存管理開啟、不允許缺貨下單的預設情況下,平常一般不會超賣,庫存到零會自動停售,真正出事的是搶購那一瞬間,幾百個人幾乎同一秒搶最後幾件,從按下下單到系統扣庫存之間有極短的時間差,好幾張訂單都在那個縫隙裡以為「還有貨」,於是同一件貨被賣了好幾次。我們開發外掛時設計壓力測試,就是專門在開賣前把這個縫隙逼出來。
為什麼平常測不出來,一搶購就爆
因為真實的搶購從來不是一個人慢慢下單,而是幾百個人同一秒衝進來,每個人的瀏覽器都在問系統「還有貨嗎?」,而系統還來不及把「剛剛那一單」記進資料庫,就回答了下一個人「有喔」,這就像一間只剩一個空位的餐廳,門口同時站了五組客人,服務生對每一組都說「裡面還有位子,請進」——五組人都進去了,位子只有一個。
平常一個人測,永遠測不到這個場景,因為你不可能自己一個人同時是五組客人。你要真的找五組客人同一秒衝門,才知道服務生會不會出包。壓力測試做的就是這件事:把「幾百人同時搶」這個最容易出事的瞬間,在開賣前先模擬一次。
壓力測試到底在測什麼
我們的做法是開一個真的資料庫、真的裝上 WooCommerce,然後同時開十個程序一起搶,模擬直播喊單、秒殺開賣那一刻,幾百個人湧進來的真實壅塞,這比一般測試更真實,因為它是「真的同時」,不是排隊一個接一個,能把資料庫層級的搶奪問題逼出來。
這種真環境的驗證方式,跟我們替金流外掛做的端對端測試是同一套精神:不用假資料唬自己,直接在最接近正式環境的條件下跑。
情境一:一百人搶三十個名額,一個都不能多賣
我們設定一個限量 30 份的搶購,一次灌進 100 筆下單,用十個程序同時處理,看系統守不守得住。理想的結果只有一種:剛好 30 筆成交,第 31 筆之後全部擋下,庫存不能變成負數。
實際跑出來,剛好 30 筆成交、一件都沒超賣、零筆失敗,靠的是資料庫層級的原子鎖加上卡到時自動重試。白話就是每次只准一個人「碰」那批庫存,碰到的人扣完、放手,下一個人才能碰,絕不會兩個人同時以為自己搶到了最後一件。
這種瞬間湧入大量訂單的處理,WooCommerce 官方後來也推出了高效能訂單儲存機制來幫忙扛,但底層的搶奪防護仍然得靠外掛自己設計、自己驗過。
對你的意義很直接:就算幾百人在同一秒搶 30 個名額,系統也絕不會多賣。 你不用等真的開賣、不用賭運氣,開賣前就有一張白紙黑字的證明。
情境二:一個人狂刷,限購三件他就只能買三件
搶購還有另一種災難,是黃牛或機器人用同一個帳號狂刷。
我們模擬一個人對限購 3 件的商品,連續灌 20 次下單。正確的結果是:剛好成交 3 筆,剩下 17 筆全部擋掉。跑出來就是這個數字,一件不多。限購規則不是設定介面上打個勾就算數,要真的拿「同一個人瘋狂重複下單」去壓,才知道那個勾到底有沒有用。
情境三:付款和過期同時發生,訂單不會被算兩次
搶購場景裡有個很隱蔽的坑:庫存預留的過期回收。
客人下單但還沒付款時,系統會先把貨預留給他;如果他一直不付,過一段時間系統要自動把貨收回來、放給下一個人。麻煩在於如果客人「剛好在系統要回收的那一秒付款成功」呢?這件貨到底算賣掉了,還是該收回?
我們把這個競爭也壓了一次:讓「付款程序」和「過期回收程序」同時去搶同一批預留。結果是每一筆預留都只會被其中一方處理掉,付款的歸付款、過期的歸過期,數字加起來剛好,沒有任何一筆被重複計算、也沒有一筆被漏掉。這種坑平常幾乎不可能手動測到,因為你很難剛好卡在那一秒,但在真實的高流量搶購裡,它遲早會發生。
情境四:通知只發一次,不重複、不漏發
搶到之後,系統要通知客人「你搶到了、去結帳」。搶購當下這種通知會瞬間爆量,這裡最怕兩件事:同一個人收到五次一模一樣的通知被騷擾,或是搶到了卻沒收到通知、結不了帳。
我們讓十個程序同時搶著送同一批通知,製造最激烈的競爭。用的是一種「認領加租約」的機制,每一則通知在多個程序搶的情況下,只會被其中一個程序拿去、而且只送一次。跑出來剛好每則各發一次、零漏發、零重複。既不會有人被同一則訊息轟炸,也不會有人該收沒收到。
這些測試,對你的店意味著什麼
把上面幾關串起來,壓力測試真正留給你的,是一句話的安心:開賣之前,就知道系統扛不扛得住。
設計過壓力測試的外掛,是在你按下「開賣」之前,已經先用幾百人份的併發流量,把超賣、限購失效、重複扣款、通知轟炸這些坑全部走過一遍,確定每一個都守得住。這套「開賣前先自動驗過」的做法,我在如何自動化測試 AI 開發的 WordPress 外掛裡談過更完整的脈絡,壓力測試只是其中的一關。
如果你正在規劃限量搶購、直播喊單、預購開賣這類會瞬間湧入大量訂單的檔期,又不確定現在的 WooCommerce 站扛不扛得住,歡迎與我聯絡,我們可以一起看看你的搶購情境該怎麼測、怎麼守。畢竟搶購的流量是難得的機會,不該變成災難的開始。