最近接触到websocket.io 多节点需求很简单,利用websocket.io 多节点让用户参与一个1v1的小游戏
环境是分布式部署,且每台服务器是多进程web服务器使用nodejs,websocket.io 多节点框架选用了socket.io 多节点.io
首先,在單服务器调研在利用nodejs多进程(cluster)时,建立websocket.io 多节点时会出现400报错后来发现了是多进程的问题,用户访问服务器时不能保证每次访问到相哃的进程中所以后台会报错"Session ID unknown",可能是socket.io 多节点.io为了保证偶尔有可能会变成long polling必须保证前后台要传递一个session
id,但是每次页面刷新时重新发起websocket.io 哆节点应该和上次的刷新前的websocket.io 多节点没关系了才对,也有可能是socket.io 多节点.io为了保证与服务器重连节省资源才引入了session id不知道我的理解对不对。
利用配置ip_hash让用户每次都连接到固定的进程没玩过nginx不太懂。
看了网上最多的既成的推荐方案也是redis之前没有接触过redis,不知道其运行原理大概了解之后,发现他是一个key-value的持久化存储与MemCache、mongoDB类似,官网给出的代码示例:
示例很简单把请求弄一个适配器转向到连接redis服务,但昰原理是什么样的呢共享内存的方案吗,不太懂所以也没下手
最后我选用了一个比较傻的方案,在不同的子进程中启动websocket.io 多节点服务时選用了不同的端口比如一台服务器8核,会有8个端口这样用户连接某个固定端口时就不会再出现400error了,但是用户命中到不同的端口后相互之间如何通信仍然是个问题,这只是单台服务器实验如果是集群,相互通信也是一个问题而且关键是否需要每次用户都连接到同一個端口和同一台服务器呢?说到底还是对websocket.io 多节点了解太少了,希望能在这里得到一点指导和帮助