摘要:單進程讀寫性能可達萬,不同的進程使用不同的管道通信,可以最大化利用多核。但這任務如果是調用程序接口時,由于網絡的延遲,增加的任務大于消費的任務時,內存占用會不斷的增加,導致服務器的內存被占滿。
應用場景簡介
與硬件設備連接通訊(定位設備)
IM系統(用于直播頁面的聊天通訊)
場景1 - 實時收集定位數據實時輸出(例 滴滴司機行駛軌跡)說明:
需要將所有的定位設備實時的接收,將實時的軌跡記錄顯示在地圖上
注意點:
第一點:
web1服務器 連接的用戶1,2,3,web1廣播信息時只能廣播用戶1,2,3,不能廣播web2連接的用戶4,5,6,假設場景是聊天,用戶1發送一消息,只有web1 服務器的用戶能看到,web2的用戶全部不能收到
第二點:消息的頻率控制,例:100個設備,100個用戶, 100個設備每秒上傳一條數據,需要實時廣播給每個用戶,就是每秒要100*100 = 1W次,所以可以匯總每秒數據廣播給所有用戶等等方法
數據傳輸的流程圖:
不包含業務邏輯,將web1,web2,接收的消息匯總然后再廣播給web1,web2,再廣播給用戶
說明:需要把所有的定位設備上傳的數據入庫,設備7個,每秒一條數據,個人使用swoole 的task 函數(投遞一個異步的任務到 task_worker池中,此函數是非阻塞的, worker進程數同樣可以配置) 后調用接口方式入庫
服務器內存報警問題
原因: 在于swoole_server->task 函數
官方介紹task底層使用Unix Socket管道通信,是全內存的,沒有IO消耗。單進程讀寫性能可達100萬/s,不同的進程使用不同的管道通信,可以最大化利用多核。
但這任務如果是調用程序接口時,由于網絡的延遲,增加的任務大于消費的任務時,內存占用會不斷的增加,導致服務器的內存被占滿。
解決方法:消息針對入任務的頻率控制,可以根據自己的業務場景定義這個時間與是否可延遲等情況,匯總1秒內的所有數據再調用程序接口(匯總時個人使用redis),最好能直接入庫,不必調用接口
簡單代碼片段,不全(供初學者了解,官方網站demo相似)
function __construct($config) { $this->config = $config; $this->serv = new SwooleServer($config["server"]["host"], $config["server"]["port"]); // 連接redis $this->redis = new PredisClient($config["redis"]); $this->storage = new Storage($this->config); $this->serv->set([ "worker_num" => $this->config["server"]["workerNum"], //工作進程數量 "daemonize" => $this->config["server"]["daemonize"], //是否作為守護進程 "task_worker_num" => $this->config["server"]["taskWorkerNum"], ]); $this->serv->on("connect", function ($serv, $fd){ $this->onConnect($fd, $serv); }); $this->serv->on("receive", function ($serv, $fd, $from_id, $data) { $this->onReceive($fd, $serv, $data); }); $this->serv->on("Close", function($server, $fd) { $this->onClose($fd, $server); }); $this->serv->on("Task", function($server, $task_id, $from_id, $data) { $this->onTask($server, $task_id, $from_id, $data); }); $this->serv->on("Finish", function($server, $task_id, $data) { $this->onFinish($server, $task_id, $data); }); $this->serv->start(); } public function onTask($serv, $task_id, $from_id, $data){ // insert 方法是通過接口入庫 $this->storage->insert($data); } public function onReceive($fd, $serv, $data) { $this->storage->writeLog("message:".$data); $data = $this->formatData($data, $fd); $serv->task($data); } public function onClose($fd, $serv) { // writeLog 方法是寫入log $this->storage->writeLog("close fd:".$fd); } public function onFinish($serv, $task_id, $data) { return ""; }場景-IM系統
參考官方github: webim系統.
官方wiki: swoole 框架wiki
好處
封裝了數據庫的model類,數據庫的ORM接口
redis的封裝,可以實現多實例訪問
框架有一些常用的方法,像log 等等(我只用到了log)
webim 官方有demon,可以參考
壞處:
文檔特別不全,一個簡單的實現會折騰半天
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26116.html
摘要:是一個基于擴展實現的輕量級高性能的常駐內存型的和應用服務框架高度封裝了,,服務器,以及基于實現可擴展的服務,同時支持包方式安裝部署項目。基于實用,抽象事件處理類,實現與底層的回調的解耦,支持同步異步調用,內置等常用組件等。 swoolefy swoolefy是一個基于swoole擴展實現的輕量級高性能的常駐內存型的API和Web應用服務框架,高度封裝了http,websocket,ud...
摘要:在禁止場景中使用協程會出現各種莫名其妙的問題發生。限制了協程的應用范圍。新版本基于匯編代碼實現了全新的協程內核。實現了對所有語法的支持。穩定性和健壯性均已達到工業級的水準。完全可用于大型項目的生產環境中。 Swoole雖然在2016年就支持了協程特性,但由于底層是基于setjmp/longjmp實現的stackless方案。因此在某些場景下,如call_user_func、array_...
摘要:在中的應用官網源碼解讀號外號外歡迎大家我們開發組定了一個就線下聚一次的小目標上一篇源碼解讀反響還不錯不少同學推薦再加一篇講解一下中使用到的功能幫助大家開啟的實戰之旅服務器開發涉及到的相關技術領域的知識非常多不日積月累打好基礎是很難真正 date: 2017-12-14 21:34:51title: swoole 在 swoft 中的應用 swoft 官網: https://www.sw...
摘要:異步操作廢話不說直接進入正題應用場景業務邏輯中經常會出現發送信息發送郵件記錄日志等等這個時候用異步再好不過了用戶直接的體驗就是使用的賊流暢使用技術這個不僅僅支持了其他語言也支持有的擴展用起來更方便感覺上異步隊列不同點有個隊列專門用來存儲發送 PHP異步操作 廢話不說直接進入正題: 應用場景: 業務邏輯中經常會出現發送信息,發送郵件,記錄日志等等,這個時候用異步再好不過...
摘要:搶占式調度我們在今年年初就計劃實現的搶占式調度,以滿足實現有些場景下的不均衡調度帶來的問題。考慮開線程,負責檢查當前執行協程執行時間。達到我們的第二個協程主動搶占第一個協程的效果。 前言 Swoole內核團隊開設的專欄,會逐漸投入精力寫文章介紹Swoole的開發歷程,實現原理,應用實踐等,大家可以更好的交流,共同學習,建設PHP生態。 協程調度 去年Swoole推出了4.0版本后,完整...
閱讀 3615·2021-11-22 09:34
閱讀 3186·2021-11-15 11:38
閱讀 3039·2021-10-27 14:16
閱讀 1233·2021-10-18 13:35
閱讀 2424·2021-09-30 09:48
閱讀 3429·2021-09-29 09:34
閱讀 1626·2019-08-30 15:54
閱讀 1818·2019-08-26 11:57