除了利用快取來減少資料庫本身的負擔,縱向或者橫向拓展來提升主機資源以外,還有一個提升系統承載量的方式,是將部分 IO 存取平行進行。
今天我們就來聊聊在 Laravel 裡面怎麼做到這件事情
在系統運作期間,我們可能會遇到一些流程,像是存取資料庫、存取第三方 API、寫入檔案……等等
這些操作其實並不消耗計算資源,但是由於要等待網路等輸入輸出(Input/Output,I/O),所以等待會比較花時間。
如果要不在這上面花時間,我們可以將這段邏輯開始執行後,先放到一旁等待完成。等之後需要取得對應資料時,再去取出結果。
也就是平行處理任務的概念
存取第三方 API 時,Laravel 一般的方式,是使用 Http
這個 facade。
$response = Http::get('http://example.com');
如果我們想要同時取出多個 API 內容,而不是等第一筆取出之後再存取下一個 API,
我們可以使用 Http::pool()
$responses = Http::pool(fn (Pool $pool) => [
$pool->get('http://api.1.io/'),
$pool->get('http://api.2.io/'),
$pool->get('http://api.3.io/'),
]);
$responses
會拿到所有回傳的陣列,所以我們以陣列的方式操作即可
除了 API 存取之外,有時候我們也會希望其他的任務可以
這時候我們可以利用 Concurrency
來幫我們將任務分成不同進程處理
[$userCount, $orderCount] = Concurrency::run([
fn () => DB::table('users')->count(),
fn () => DB::table('orders')->count(),
]);
這樣一來,任務就不會被耗時的 I/O 所阻擋了。
由於 PHP 語言的特性,以及 Laravel 框架設計的概念。
其實在平行處理任務上面,確實並不是很好處理。
和其他語言可以在複雜的任務上建立執行緒甚至協程比較,Laravel 能做的事情相對少了很多。
不過這邊還是介紹了一些處理的方式,希望如果讀者的專案遇到效能問題,可以看到對應的處理方式。
今天的部分就到這邊,我們明天見!