workerman学习笔记(二. 原理篇)

  Worker是WorkerMan中最基本容器,Worker可以开启多个进程监听端口并使用特定协议通讯,类似nginx监听某个端口。每个Worker进程独立运作,采用Epoll(需要装event扩展)+非阻塞IO,每个Worker进程都能上万的客户端连接,并处理这些连接上发来的数据。主进程为了保持稳定性,只负责监控子进程,不负责接收数据也不做任何业务逻辑。

请看下图:

 

  从此图中我们我可以清晰的看到,不同的worker进程都负责着一定数量的客户端连接,彼此之间互不干扰。每个worker进程的运行情况都受到master进程(主进程)的监控。

 

  从这张图中我们我可以看到,图1中的所有worker进程都被放在worker进程池中统一管理,而主进程的工作就是监视这片worker进程池。

  PS.下面介绍一下手册上关于开发必须知道的几个问题:

  1.workerman是通过命令行启动的:一般网页空间无法使用workerman。

  2.客户端和服务端协议一定要对应才能通讯:以websocket为例,客户端和服务端必须同时遵守websocket协议才能完成通讯。另外需要注意:不要尝试在浏览器地址栏访问websocket协议端口,不要尝试用webscoket协议访问裸tcp协议端口,协议一定要对应。因此可以考虑通过html页面的js来测试websocket协议端口,下面贴上一段我自己的测试代码:  

<!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消息,主动释放连接。也有服务端主动断连的情况,凡是在一次消息交互(发请求-收响应)之后立刻断开连接的情况都称为短连接。因为长连接的保持会消耗系统资源,所以长时间未通讯的长连接会被某些节点的防火墙关闭而强行断开。手册上关于心跳的介绍如下:  

心跳作用主要有两个:

1、客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连接断开的情况。

2、服务端可以通过心跳来判断客户端是否在线,如果客户端在规定时间内没有发来任何数据,就认为客户端下线。这样可以检测到客户端由于极端情况(断电、断网等)下线的事件。

建议值:

建议心跳间隔小于60秒

  4.不要使用exit die语句,否则进程会退出。当然,进程退出了会立刻重启一个新的进程继续服务。如果需要返回,可以调用return。

posted @ 2018-03-01 16:03  一船清梦压星河  阅读(877)  评论(2编辑  收藏  举报