併發過高導致庫存買超情況

生產環境中遇到併發過高,導致庫存買超的情況。

可以通過以下幾種情況解決:

1.使用數據庫鎖機制防止併發

方法1 select for update;

update set stock = stock - x;

insert into order_list(order_id) values (1);

方法2 return = update set stock = stock -x where category_id = 1 and stock - x > 0;

if !return exit;

2.使用zk等分佈式鎖

3.藉助文件排他鎖,在處理下單請求的時候,用flock鎖定一個文件,如果鎖定失敗說明有其他訂單正在處理,此時要麼等待要麼直接提示用戶"服務器繁忙"

阻塞(等待)模式



<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
  //..處理訂單
  flock($fp,LOCK_UN);
}
fclose($fp);
?>

非阻塞模式


<?php
$fp fopen("lock.txt""w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
  //..處理訂單
  flock($fp,LOCK_UN);
}
else
{
  echo "系統繁忙,請稍後再試";
}
 
fclose($fp);
?>

4.使用排隊等待機制順序處理

5.使用redis等單線程處理機制

如果依然扛不住流量怎麼辦

1.拆分鎖的粒度

2.降級需求,分散用戶活躍時間

如果用戶一直未支付,放到未支付的隊列裏面,把相應的庫存補回來



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章