workerman學習筆記(二. 原理篇)

  Worker是WorkerMan中最基本容器,Worker能夠開啓多個進程監聽端口並使用特定協議通信,相似nginx監聽某個端口。每一個Worker進程獨立運做,採用Epoll(須要裝event擴展)+非阻塞IO,每一個Worker進程都能上萬的客戶端鏈接,並處理這些鏈接上發來的數據。主進程爲了保持穩定性,只負責監控子進程,不負責接收數據也不作任何業務邏輯。html

請看下圖:nginx

 

  今後圖中咱們我能夠清晰的看到,不一樣的worker進程都負責着必定數量的客戶端鏈接,彼此之間互不干擾。每一個worker進程的運行狀況都受到master進程(主進程)的監控。web

 

  從這張圖中咱們我能夠看到,圖1中的全部worker進程都被放在worker進程池中統一管理,而主進程的工做就是監視這片worker進程池。瀏覽器

  PS.下面介紹一下手冊上關於開發必須知道的幾個問題:websocket

  1.workerman是經過命令行啓動的:通常網頁空間沒法使用workerman。socket

  2.客戶端和服務端協議必定要對應才能通信:以websocket爲例,客戶端和服務端必須同時遵照websocket協議才能完成通信。另外須要注意:不要嘗試在瀏覽器地址欄訪問websocket協議端口,不要嘗試用webscoket協議訪問裸tcp協議端口,協議必定要對應。所以能夠考慮經過html頁面的js來測試websocket協議端口,下面貼上一段我本身的測試代碼:  tcp

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<script>
function connect(){
  // 假設服務端ip爲127.0.0.1,端口爲2121
  var ws = new WebSocket("ws://127.0.0.1:2121");
  ws.onopen = function() {
    alert("鏈接成功");
    ws.send('tom');
    };
  ws.onmessage = function(e) {
    alert("收到服務端的消息:" + e.data);
    };
   }
</script>
<body>
  <button id="test" onclick="connect()">請單擊</button>
</body>
</html>測試

  3.長鏈接必須加心跳:先來區分一下長鏈接和短鏈接,長鏈接也叫持久鏈接,在TCP層握手成功後,不當即斷開鏈接,並在此鏈接的基礎上進行屢次消息(包括心跳)交互,直至鏈接的任意一方(客戶端OR服務端)主動斷開鏈接,此過程稱爲一次完整的長鏈接。短鏈接,顧名思義,與長鏈接的區別就是,客戶端收到服務端的響應後,馬上發送FIN消息,主動釋放鏈接。也有服務端主動斷連的狀況,凡是在一次消息交互(發請求-收響應)以後馬上斷開鏈接的狀況都稱爲短鏈接。由於長鏈接的保持會消耗系統資源,因此長時間未通信的長鏈接會被某些節點的防火牆關閉而強行斷開。手冊上關於心跳的介紹以下:  spa

心跳做用主要有兩個:命令行

一、客戶端定時給服務端發送點數據,防止鏈接因爲長時間沒有通信而被某些節點的防火牆關閉致使鏈接斷開的狀況。

二、服務端能夠經過心跳來判斷客戶端是否在線,若是客戶端在規定時間內沒有發來任何數據,就認爲客戶端下線。這樣能夠檢測到客戶端因爲極端狀況(斷電、斷網等)下線的事件。

建議值:

建議心跳間隔小於60秒

  4.不要使用exit die語句,不然進程會退出。固然,進程退出了會馬上重啓一個新的進程繼續服務。若是須要返回,能夠調用return。

相關文章
相關標籤/搜索