Swoole 程式模型分析

PHP定製開發發表於2022-09-21

在這邊文章中我們將介紹以下內容:

1、Swoole Server 的執行模式

2、Swoole 程式模型分析

Swoole 程式模型分析
swoole 程式

上圖是 Swoole 官網提供的各個程式相互關係圖,可以說理解了這張圖,你就理解了 Swoole 的程式模型。

1、 Swoole Server 的執行模式

常見的執行模式有 單執行緒模式程式模式兩種,兩種方式介紹如下:

單執行緒模式 (SWOOLE_BASE)  這種模式就是傳統的非同步非阻塞 Server,與 Nginx 和 Node.js 等非同步服務的原理是一樣的。在這種模式下,事件迴圈會直接回撥 PHP 的函式,而不是透過執行緒 dispatch 投遞任務。如果在回撥函式中有阻塞操作,就會導致 Server 退化為同步模式。 就像在上一篇文章中 Nginx+PHP-FPM 架構中介紹的那樣,Nginx 只做轉發,具體業務由 PHP-FPM 來實現。假如 Nginx 也可以處理業務邏輯,一旦出現阻塞的業務邏輯,Nginx 的效能會急劇下降。正是因為 Nginx 和 PHP-FPM 所起到的作用不同,才會造就 Nginx 的高效能。 Base 模式的特點:沒有 Master 程式的角色;每個 Worker 程式同時承擔了 Process 模式下 Reactor 執行緒和 Worker 程式兩部分職責;在這種模式下,Manage 程式是可選的,當設定了 worker_num=1,並且麼有使用 Task 和 MaxRequest 特性時,底層將直接建立一個單獨的 Worker 程式,不建立 Manager 程式  Base 模式的優點:沒有 IPC 開銷,效能更好;程式碼簡單,不容易出錯。 Base 模式的缺點:TCP 連線時在 Worker 程式中維持的,所以當某個 Worker 程式掛掉時,此 Worker 內的所有連線都將被關閉;少量 TCP 長連線無法利用到所有的 Worker 程式;TCP 連線與 Worker 程式是繫結的,在長連線應用中,不同的 Worker 程式無法實現負載均衡。例如:某些連線的資料量很大,這些連線所在的 Worker 程式的負載會非常高。但是某些連線資料量很小,所在 Worker 程式的負載會非常低。 Base 模式適用場景:如果客戶端連線之間不需要互動,可以使用 Base 模式。如 Memcache、Http 服務等。

程式模式 (SWOOLE_PROCESS)  多程式模式比較底層實現比較複雜,用了大量程式間通訊、程式管理機制。適合業務邏輯非常複雜的場景。Swoole 提供了完善的程式管理、記憶體保護機制。在業務邏輯非常複雜的情況下,也可以長期穩定執行。

2、 Swoole 程式模型

從上圖中可以看出,Swoole 在啟動後會建立 Master 程式和 Manager 程式。Master 程式會建立 Master 執行緒、Reactor 執行緒、心跳檢測執行緒等,Manager 程式會建立 Worker 程式和 Task 程式。

Swoole 的執行緒和程式之間分別有什麼作用呢?

Master 程式 這個程式是 swoole 的核心程式,也是一個多執行緒的程式,一個 Master 執行緒和多個 Reactor 程式,Reactor 執行緒的數量可以配置。

Master 執行緒  Master 執行緒用於 accept 新的連線,然後會評估每個 Reactor 執行緒維護的連線數,最後將這個新的連線分配給連線數量最少的那個 Reactor 執行緒,從而保證每個 Reactor 執行緒的負載量是均衡的。 Master 執行緒還負責對所有訊號的接管(包括請求處理、重啟程式、過載配置等),避免 Reactor 執行緒收到訊號的打擾中斷。

Reactor 執行緒 當一個 socket 可讀或可寫的時候,就由 Reactor 執行緒將事件轉發給 worker 程式。

Manager 程式  Manager 程式管理著 Worker 程式和 Task 程式,Worker 程式和 Task 程式是由 Manager 程式 fork 出來的。Manager 程式會監管 Worker 程式和 Task 程式的狀態,當他們意外掛掉時,Manager 程式會重新拉起新的程式,Manager 程式還負責 Worker 程式和 Task 程式的平滑重啟。

Worker 程式  Worker 程式是由 Manager 程式 fork 而來,用於處理具體的業務邏輯。Worker 程式可以用同步的方式去幹活,也可以用非同步的方式去幹活。

Task 程式  Task 程式是一種特殊的 Worker 程式,專門用於處理一些比較耗時的操作。Task 程式只能工作在同步的方式下,不能使用非同步。所以 Task 程式中不能使用定時器,而 Worker 程式可以。

以上就是本文的全部內容,如有錯誤,請指正!可以相互關注,方便一起交流技術心得。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70021881/viewspace-2915688/,如需轉載,請註明出處,否則將追究法律責任。

相關文章