站點高併發寫問題的乙個解決實踐

2021-06-29 02:11:40 字數 1919 閱讀 7986

我負責乙個基於yii的lamp站點維護和優化,其中有乙個表的併發寫很高,導致使用者體驗差,甚至寫失敗造成資料丟失,分析後發現這個表其實併發讀要求很低,所以計畫將寫記錄到log中,定期將log寫入mysql。

log4php在yii中使用

<?php 

return

array(

'rootlogger' => array(

),'default' => array(

'layout' => array(

'class' => 'loggerlayout******'

),'params' => array(

'datepattern' => 'y-m-d.h',

'file' => './history_log/history-%s.log',))

));

很簡單吧,當然,要在yii的index.php中對庫引用:

// history_log

$log4php=dirname(__file__).'/log4php/logger.php';

$log4phpconfig=dirname(__file__).'/log4php/config.php';

require_once($log4php);

logger::configure($log4phpconfig);

使用上,在業務處舉個栗子:

logger::getrootlogger()->info(json_encode($item));
這樣,資料就記錄在日誌中,舉個栗子:

週期將log寫入資料庫

我使用shell和yii的commands支援相結合來做定期指令碼,意識流,為了省事。

shell來獲取時間並呼叫yii command:

logtime=$(

date --date='1 hour ago' +%y-%m-%d.%h)

/home/qec/qss/www/protected/yiic updatehistory $logtime

yii php用來讀log,寫mysql,乙個繼承yii的cconsolecommand類就好:

class

updatehistorycommand

extends

cconsolecommand

public

function

run($args)

$logtime = $args[0];

$logfilename = 'history-'.$logtime.'.log';

echo

"logfilename: ",$logfilename,"\n";

echo

self::logpath.$logfilename,"\n";

$path= self::logpath.$logfilename;

$logfd = fopen($path, 'r');

if($logfd == 0)

$this->addlogtohistory($logfd);

}...

最後,crontab裡面加入定時任務:

5 * * * * source /home/qec/.bash_profile;cd /home/qec/qss/www/protected/commands; sh hourlyjobs.sh >> ../runtime/hourlyjobs.log

就可以了。

ps:第一次使用markdown,感覺不錯。

設計乙個高併發系統

公升級過程為 最初系統 新增負載均衡 資料庫分庫分表 讀寫分離 快取集群 訊息中介軟體集群 假設系統機器是4核8g,資料庫伺服器是16核32g。日活使用者1w,系統層面每秒10次請求,資料庫層每秒30次請求。使用者量增長了50倍,日活使用者50萬,高峰期對系統每秒請求500 s,對資料庫的每秒請求1...

如何設計乙個高併發系統

總結如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官也絕對不會這樣來問你,否則他就是蠢。假設你在某知名電商公司幹過高併發系統,使用者上億,一天流量幾十億,高峰期併發量上萬,甚至是十萬。那麼人家一定會仔細盤問你的系統架構,你們系統啥架構?怎...

如何設計乙個高併發系統

系統拆分,將乙個系統拆分為多個子系統,用dubbo來搞。然後每個系統連乙個資料庫,這樣本來就乙個庫,現在多個資料庫,不也可以抗高併發麼。快取,必須得用快取。大部分的高併發場景,都是讀多寫少,那你完全可以在資料庫和快取裡都寫乙份,然後讀的時候大量走快取不就得了。畢竟人家redis輕輕鬆鬆單機幾萬的併發...