huenchao / questions

每天想到的问题,都放在issue中。
6 stars 2 forks source link

你知道nodejs的cluster吗? #7

Open huenchao opened 4 years ago

huenchao commented 4 years ago

问题来源:

使用socket.io这个库,在建立websocket通信的时候,由于兼容性原因,会发出大概5次http请求给服务器,来询问是否可以建立websocket,以及是否链接成功。我们的node项目是部署在集群上的,每一个pod的nodejs进程,又利用cluster,fork出n个worker去处理请求。

场景复现:

假设,用户为U,一个pod上fork出了5个worker,他们叫A、B、C、D、E。U要和server建立一个websocket链接,还记得上面说过,建立链接需要5次http请求,所以master可能会把第一个http分给了A处理,第二个给了B....第五个给了E。这就造成建立链接失败。所以后来改进了策略,直接一次http来升级协议。

问题描述:

  1. 假设U和A使用一次http来升级协议,建立链接后,消息不会错乱?
  2. 怎么保证5次http也不会错乱?
huenchao commented 4 years ago

解决上面的疑问需要搞清楚如下几个点:

  1. linux下什么叫做fd。就是结构体的下标。
  2. 父子进程关于fd的关系。fork出来的都是直接复制一份,其他随机。
  3. Linux中,一个端口能够接受tcp链接数量的理论上限是?。只受到进程的fd限制,TCP连接属于4元祖,本地端口可以无限的重用下去,比如master-worker模型, 监听fd被传递到创建worker进程,那么每个worker进程都可以accept若干相同本地端口的fd。
  4. 可以多个server进程同时监听一个unix socket文件么?进程先listen,然后fork 多个子进程,每个子进程再accept 就会出现这种状况。connect的连接具体被哪个子进程accept返回是由内核分发。unp,apue 上都有讲。
  5. SO_REUSEADDR这个字段的含义???
huenchao commented 4 years ago

强烈推荐的文章:https://segmentfault.com/a/1190000010260600