有時(shí)候處理請(qǐng)求時(shí)需要快速響應(yīng)用戶,而把慢業(yè)務(wù)繼續(xù)留在進(jìn)程里執(zhí)行,就像php-fpm使用fastcgi_finish_request函數(shù)就能達(dá)到這個(gè)效果。我知道webman是php進(jìn)程處理請(qǐng)求,我想問用webman有沒有這種類似的處理慢業(yè)務(wù)方案?
除了文檔里提到的使用 隊(duì)列、慢業(yè)務(wù)進(jìn)程等方案,還有其他方案嗎?
文檔里提到的使用 隊(duì)列、慢業(yè)務(wù)獨(dú)立進(jìn)程等方案,這些會(huì)增加程序設(shè)計(jì)復(fù)雜度。
本來一個(gè)簡簡單單的需求增加了復(fù)雜度。我只想在當(dāng)前控制器里處理對(duì)應(yīng)的慢業(yè)務(wù),同時(shí)也能快速響應(yīng)用戶的請(qǐng)求。傳統(tǒng)的php-fpm使用fastcgi_finish_request()后,后面再寫慢業(yè)務(wù)代碼,這樣就能完美解決問題。
案例1:
收到支付回調(diào)(如微信、支付寶等)時(shí),驗(yàn)證成功并保存數(shù)據(jù)庫支付表后就要馬上把處理結(jié)果響應(yīng)回去,而后續(xù)的其他操作再慢慢執(zhí)行,例如,后續(xù)處理通知游戲發(fā)放元寶、記錄日志等操作,這些常常因?yàn)榈谌骄W(wǎng)絡(luò)、服務(wù)器問題,或者IO問題導(dǎo)致處理速度比較慢。
在php-fpm項(xiàng)目中我基本都這樣操作的:
register_shutdown_function(['Util', 'shutdown_function'], null, [], true);
//Util class...
public static function shutdown_function($func, $params = [], $end = false)
{
static $stack = [];
if ($func) {
$stack[] = [
'func' => $func,
'params' => $params
];
}
if ($end) {
function_exists('fastcgi_finish_request') && fastcgi_finish_request();
foreach ($stack as $v) {
call_user_func_array($v['func'], $v['params']);
}
}
}
fastcgi_finish_request 如果返回用戶信息成功了,但是 后續(xù)的業(yè)務(wù)處理失敗了 怎么搞???隊(duì)列是最保險(xiǎn)的,而且你項(xiàng)目不用redis嘛? 如果用就是 一個(gè)命令安裝包的事,你這種異步 太危險(xiǎn)了 數(shù)據(jù)容易丟失