无码国产精品一区二区免费网曝|国产精品无码永久在线观看|色悠久久久久久久综合网|在线播放不卡的av

位置導航:首頁 > 建站技術(shù) > 新聞詳情
關(guān)于PHP高并發(fā)搶購系統(tǒng)設計
作者:蜂巢建站      時間:2017-05-12 12:10:34      點擊:47397
內(nèi)容
并發(fā)搶購系統(tǒng)注意事項
高并發(fā)架構(gòu)設計描述
程序端核心代碼實現(xiàn)
訂單流程mysql 端并發(fā)解決方案


注意事項
(1)高并發(fā)環(huán)境下,對于服務器cup、內(nèi)存、網(wǎng)絡寬帶使用率會瞬間暴漲,需要注意對同服務器上其他應用的影響。(項目解耦,高并發(fā)應用獨立部署)
(2)服務器高負載運行,容易出現(xiàn)死機,重啟服務器場景,要提前考慮內(nèi)存(redis)數(shù)據(jù)備份與恢復,防止用戶搶購數(shù)據(jù)丟失.
(3)高并發(fā)應用首先要注重穩(wěn)定性,其次是性能上優(yōu)化.


(4) 一臺服務器能夠支持多少并發(fā)量
nginx服務為例:
worker_processes 8;
worker_rlimit_nofile 102400;
use epoll;
worker_connections 102400;
ulimit -n
cat /proc/sys/fs/file-max 


架構(gòu)設計

(1)LVS服務, 做負載均衡調(diào)度, 采用RD模式, 通過股修改數(shù)據(jù)包的目的MAC地址實現(xiàn)轉(zhuǎn)發(fā),該方式性能好, 對并發(fā)高應用,適合大規(guī)模部署負載均衡機器;抗負載能力強、是工作在網(wǎng)絡4層僅作分發(fā)之用,沒有流量的產(chǎn)生;工作穩(wěn)定,自身有完整的雙機熱備方案
(2)keepalive(vrrp協(xié)議方式) 做心跳檢測,支持應用具有高可用性。
(3)nginx工作在網(wǎng)絡的7層,所以它可以針對http應用本身來做分流策略, 可用說對LVS負載的補充。nginx高效處理高并發(fā)請求在于采用異步非阻塞工作方式和epoll IO 模型。  
(4)頁面動態(tài)數(shù)據(jù),用戶數(shù)據(jù),搶購商品數(shù)據(jù)采用Redis存儲。
(5)用戶搶購記錄標識存儲在Redis服務器端。在nginx負載均衡端,應用lua腳本做用戶搶購記錄過濾。
(6)real server端部署 nginx與php, 同時 real server 可以參與負載端調(diào)度。
(7)mysql server cluster 端采用一主多從部署,master負載數(shù)據(jù)寫及同步到slave, slave負責數(shù)據(jù)讀取。推薦應用mysql代理組件atlas, 實現(xiàn)對php端對mysql讀寫透明操作。
核心代碼實現(xiàn)
背景
假設每個用戶只允許搶購一件商品。
預備數(shù)據(jù)
搶購商品總數(shù)存入redis中, 比如十萬個數(shù)據(jù)
$redisObj = new redis();
$redisObj->set('goods_amount', 1000000);
$redis->watch('goods_amount'); //應用redis watch 樂觀鎖
$amount = $redis->get('goods_amount');
if($amount > 0)
{
 $userInfo = $reids->get('user_info_crc32(url_token)', array('userId'=>120, '....')); 
 
  if(empty($userInfo)){
      
        $ret = $redis->multi() ->decr('goods_amount') ->exec();
      if($ret){
$reids->set('user_info_crc32(url_token)', array('userId'=>120, '....')); 
       根據(jù)crc32(url_token)唯一索引創(chuàng)建改用戶已搶過商品的標識。(同時標識可以設置一段時間有效期,例如10分鐘);
    
write("user_id", {user_id}_success.log);
      }else {
                //提示搶購失敗 
    }
 } else {
    $redis->unwatch(‘goods_amount');
    //提示搶購失敗 
} else {
    //搶購結(jié)束, 封閉入口
}
}


(1)下一個搶購請求到來時,在nginx服務器lua端,檢查googs_amount搶購商品數(shù)量,判斷搶購有沒有結(jié)束,在判斷user_info_crc32(url_token)有沒有搶過成功,如果成功跳轉(zhuǎn)到下單頁面,否則執(zhí)行搶過流程。
(2)搶購首頁直接高并發(fā)靜態(tài)資源存儲在cdn 服務端, 來減輕服務端訪問請求的壓力
mysql端并發(fā)解決
(1)搶購商品數(shù)據(jù)預熱,提前存儲在redis中,比如商品名稱,屬性等等。
(2)采用innodb 數(shù)據(jù)庫引擎,在高并發(fā)場景讀操作有優(yōu)勢,合理創(chuàng)建表結(jié)構(gòu),盡可能的減少鏈表查,可以適當設計表中冗余字段,sql查詢能夠必須走索引。
(3)用戶瀏覽商品詳情頁(需要在redis端做動態(tài)數(shù)據(jù)緩存) 
(4)用戶點擊購買跳轉(zhuǎn)到訂單詳情頁(包括用戶基本信息,商品信息,支付方式,積分消費等數(shù)據(jù)考慮對數(shù)據(jù)庫并發(fā)查詢壓力,要采用redis緩存策略)
(5)訂單數(shù)據(jù)提前生成,user_id留空,同時通過redis lpush,把連續(xù)訂單id,提前同步到redis分布式集群,redis集群支持心調(diào)檢測,能夠自動做服務奔潰切換。
(6)用戶提交訂單后,  在redis服務lpop拿到一個訂單id, 根據(jù)訂單id條件更新用戶user_id等信息。
   begin;
   update mt_account set user_id=100 where order_id=$orderId and user_id=0 li mit 1;
   commit;
正品保證 蜂巢直供,技術(shù)保障
急速響應 7*24專業(yè)人員值班
無憂售后 服務不滿意,任性退款
特色服務 私人定制建站套餐
幫助中心 常規(guī)操作指南
支付方式
0513-68783001
0513-68783002
周一至周五 9:00-21:00