php swoole 心跳,聊聊swoole的心跳

來自:桶哥的一篇關于swoole的心跳的文章,作為Swoole顧問(顧得上就問,是為「顧問」)得推一下這篇文章,最后只留下一配置,其實我也不是太明白原理,我在想如果是局域網里還需要心跳?

——————————————————————————————————————————————————————————————————————

swoole提供了一個心跳的功能,很多朋友感到困惑。

心跳是什么?

顧名思義,心跳是判斷一個事物生還是死的一個標準,在swoole里,心跳是指用來判斷一個連接是正常還是斷開的。

從TCP協議說起

我們都知道一個五元組標識一個網絡連接,創建一個連接有三次握手,而斷開一個連接有四次揮手。不管是服務器還是客戶端

發起連接的關閉,都會完整的走完四次揮手的過程,這樣,一切很完美,系統回收這個fd,應用層也可以通過onClose回調處理相關的事情.

fd是什么?

fd學名是文件描述符,在unix的哲學就是一切皆文件中,這個fd就是系統層暴露給業務層的用來表示一個五元組網絡連接的標識。你可以簡單的理解為一個索引,通過對這個fd的操作,系統層可以找到相應的連接而且進行的一系列操作,如發送數據到網瞳,進行連接關閉等等。

為什么要心跳?

剛才提到,如果我們要關閉某個連接,我們可以在業務層對fd發起關閉連接的操作,以swoole為例:

$server->close($fd);

正常情況下,都會走完整個四次揮手,(swoole會有onClose回調),系統回收fd,以待分配給其他的連接。

那系統為什么要回收fd,因為fd資源是有限的,所以必需重復利用。

但在某些情況下,如突然拔掉網線或藍翔演習挖斷光纜,服務端并不能感知到這個連接的異常,但實際上是這個連接已經失效了,如果沒有一個回收機制,這類連接將用光所有的fd,導致系統不再能接受新的連接請求,所以就有了心跳機制。

什么是心跳機制?

心跳機制就是業務層來提供一個連接是否存活的一個方法,讓系統能判定一個連接是否失效。一般有兩種實現方式:

1: 客戶端定時發送一個心跳包,告訴服務器我還活著,服務器定時檢測所有客戶端列表,看他們最后一個心跳包的時間是否過長,如果過長,則認為已無心跳,判定為死連接,主動關閉這個連接。

2: 服務器定時詢問所有的客戶端,你們還活著么?如果活著,給我個回饋,沒得到回饋的客戶端,格殺勿論。

兩種心跳方案有什么區別?

第一種方案,對服務器和網絡的壓力更小,而且更具有靈活性,但需要客戶端配合定時發送心跳包。

第二種方案,對服務器和網絡壓力更大,不建議使用。

心跳在swoole里的實現

swoole采用的是第一種方案

swoole會在主進程獨立起一個心跳線程,通過定時輪詢所有的連接,來判斷連接的生死,所以swoole的心跳不會堵塞任何業務邏輯。

那怎么判斷連接的生死了?swoole在connection結構體中有 time_t last_time 字段,用來存放最后一次收包的時間戳,進而通過與這個時間對比來判定是否存活

于是,swoole有兩個配置:

heartbeat_check_interval: 服務器定時檢測在線列表的時間

heartbeat_idle_time: 連接最大的空閑時間 (如果最后一個心跳包的時間與當前時間之差超過這個值,則認為該連接失效)

配置建議

建議 heartbeat_idle_time 為 heartbeat_check_interval 的兩倍多一點。

這個兩倍是為了進行容錯,允許丟一個包

而多一點是考慮到網絡的延時。

你可以跟據實際的業務來調整這個容錯率(允許丟幾個包)。

補充

1、系統層面也提供心跳機制,只不過粒度相對比較粗,而且時間稍長,沒有應用層靈活

2、swoole還提供ping的功能,通過配置ping值,swoole內核可以判斷只是一個心跳包,而不會,也沒必要把數據包轉發應用層(onReceive)。

3、心跳不只是swoole獨有,大多數tcp的網絡服務都會考慮到這個問題

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534447.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 查詢 投影,MySql-連接查詢

連接查詢Chloe 友好支持多表連接查詢,一切都可以用 lambda 表達式操作,返回類型可以是自定義類型,也可以是匿名類型。強類型開發,編譯可見錯誤,容錯率高。1.建立連接:var user_city_province context.Quer…

php 遞歸欄目名疊加,thinkPHP實現遞歸循環欄目并按照樹形結構無限極輸出的方法,thinkphp遞歸...

thinkPHP實現遞歸循環欄目并按照樹形結構無限極輸出的方法,thinkphp遞歸本文實例講述了thinkPHP實現遞歸循環欄目并按照樹形結構無限極輸出的方法。分享給大家供大家參考,具體如下:這里使用thinkphp遞歸循環欄目按照樹形結構無限極輸出&#…

php cannot call constructor,安裝ECshop普遍問題的解決方法

安裝時的問題:1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /usr/local/httpd2/htdocs/upload/install/includes/lib_installer.php on line 31解決:找到install/includes/lib_installer.php中的…

wind試用版 matlab,免費產品試用 - MATLAB Simulink

請選擇其一AlabamaAlaska美屬薩摩亞APO/FPO AAAPO/FPO AEAPO/FPO APArizonaArkansasCaliforniaCaroline IslandsColoradoConnecticutDelawareDistrict of ColumbiaFlorida格魯吉亞關島HawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMariana Islands馬紹爾群島Mar…

php yii2 sns,GitHub - yggphpcoder/iisns: 基于 yii2 的 sns 社區系統,一站式解決社區建站...

iisns - 地球村入口iiSNS 是基于 yii2 的 SNS 社區系統,一站式解決社區建站。可以寫文章,做記錄,上傳圖片,論壇聊天等。還可以用來做內容管理系統(CMS)。iiSNS 是一個免費的開源項目,在 MIT 許可證下授權發布。特點與功…

php mvc 商城,基于MVC框架的小型網上商城設計

2.本人對課題任務書提出的任務要求及實現預期目標的可行性分析基于MVC框架的小型網上商城實現的功能:商品的瀏覽、查詢、購買,會員注冊以及會員訂單的查詢等,方便商場活動,該系統基本實現了網上商城的應有功能。該系統…

php 做更新進度條,PHP exec()后更新Bootstrap進度條

我使用PHP來運行一個python腳本,并且在腳本執行后需要更新一個進度條。進度條更新后,將執行另一個腳本,依此類推。這里是我的代碼如此的票價。我試圖用JavaScript來實現。它沒有解決Button Textif (isset($_POST[turn])){exec("sudo pyt…

zblog php和asp功能,ZBlog是否適合PHP或ASP?我們該如何選擇?

我最近玩了zblog一段時間,對于大多數第一次聯系zblog的博客,他們會問zblog是否適合PHP或ASP?我們該如何選擇?事實上,我真的不明白這個問題。我個人更喜歡PHP。今天我將整理出來并對PHP版本和ASP版本進行比較&#xff0…

php js記住密碼功能,jquery.cookie.js實現用戶登錄保存密碼功能的方法_jquery

本文實例講述了jquery.cookie.js實現用戶登錄保存密碼功能的方法。分享給大家供大家參考,具體如下:需要導入的js有jquery.js和jquery.cookie.js在頁面加載時首先嘗試獲取cookie的值,如果cookie有值,則將獲取到的值填入輸入框中&am…

oracle dbf 超大,oracle?數據庫users01.dbf文件過大?轉移方法

如果出現 linux 拒絕錯誤,可以把目錄權限 該為777由于在安裝的時候將Oracle安裝到了C盤,表空間也創建到了C盤(當時沒有在意),等項目進行到了中期,發現C盤的空間不夠用了。此時,一個較好的解決辦法就是將表空間的文件轉…

oracle中exists連接兩個表,IN、EXISTS、多表連接,哪個速度更快

本帖最后由 ghsau 于 2011-10-11 23:39 編輯請看下面三個執行計劃(Oracle10g)1. 用INSQL> select ename from emp e where e.deptno in (select d.deptno from dept d where d.dnameSALES);PLAN_TABLE_OUTPUT------------------------------------------------------------…

php決策管理,報表管理與數據分析:為系統未來發展規劃提供決策依據,有效避免IT管理與投資的盲目??...

據了解,很多中大型企事業單位的IT基礎結構具有復雜、分散等特征,并且信息化程度越高,數據類型越繁雜,數據量也越龐大。許多單位不得不付出極大的人力、物力對網絡進行管理。而一個單位的信息化的程度和IT部門的服務水平&#xff0…

oracle遷移undo表空間,oracle切換undo表空間

Oracle里的回滾表空間在數據庫使用一段時間后,undo表空間的dbf文件往往會增長到比較大,這個時候我們需要切換undo表空間1.新建undo表空間SQL> create undo tablespace undotbs2 datafile /data/undotbs02.dbf size 10M autoextend on next 10M ;2.由于…

pppoe linux 配置文件,linux PPPOE服務端配置

查看pppo服務器安裝包pm -qa | grep pppoe 可以看到系統中pppoe server安裝包rpm -ql rp-pppoe-3.5-2 查看該安裝包安裝信息(如安裝路徑,配置文件等),如果有信息輸出,你可以看到這一行:/sbin/pppoe-serverps -e | grep pppoe-serve 查看pppoe服務有沒有運行,如果沒有,則啟動: p…

設置linux撥號服務端,CentOS Linux上搭建PPPoE服務器及撥號設置

CentOS下PPPoE撥號設置1.查看并安裝撥號軟件:[rootRedHat ~]# rpm -qa|grep pppoe[rootredhat ~]# yum -y install rp-pppoerp-pppoe.i686 0:3.10-8.el62.查看adsl-setup命令所在位置:[rootredhat ~]#whereis adsl-setupadsl-setup:或者直接搜索pppoe信息…

Linux原始網絡編程,Linux操作系統網絡編程 原始套接字 (1)

Linux操作系統網絡編程--原始套接字 (1)http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml我們在前面已經學習過了網絡程序的兩種套接字(SOCK_STREAM,SOCK_DRAGM).在這一章 里面我們一起來學習另外一種套接字--原始套接字(SOCK_RAW)。應用原始套接字,我們可以編寫…

linux上pyenv卸載,在Ubuntu 18.04系統下安裝pyenv的方法

本文介紹在Ubuntu 18.04操作系統下安裝pyenv的方法,使用它可以進行Python多版本管理,目的是防止不同的Python版本因為不兼容而出現錯誤。安裝pyenv其實非常的簡單,只需要在系統終端中運行一條命令即可,以下是操作方法,…

linux防火墻作用是什么,Linux防火墻操作1

什么是防火墻防火墻可通過監測、限制、更改跨越防火墻的數據流,盡可能地對外部屏蔽網絡內部的信息、結構和運行狀況,以此來實現網絡的安全保護。簡單來講 就是防止外界通過網絡攻擊Linux服務器的一個軟件本次學習目標:防火墻的啟停&#xff0…

linux中touch命令的作用,Linux中touch命令的作用是什么

今天微子網絡向你展示了觸摸命令在Linux中的功能。內容簡潔易懂,一定會讓你眼前一亮。希望通過這篇文章的詳細介紹,你能有所收獲。linux的Touch命令不常用,但在使用make時可能會用到,make用于修改文件時間戳或創建一個不存在的新文…

linux打jar包xml文件,springboot打jar包部署外置配置文件

一、讀取配置文件的優先級默認:Jar包同級目錄的config目錄Jar包同級目錄classPath(即resources目錄)的config目錄classpath目錄最高優先級的方式是項目啟動時通過命令的方式指定項目加載核心配置文件,命令如下java –jar xxxx.jar -Dspring.config.locat…