按文档说的,egg-socket.io的sticky模式是为了解决cluster的问题,那么这跟nginx配置反向代理时的ip_hash有什么区别吗?
[eggjs/egg]egg-socket.io 中的sticky模式和nginx配置ip_hash的区别
回答
@ngot
经过实测,sticky模式没用,真的,我经过测试发现还是有连接不在一个进程上
我所理解的是 ip_hash是以服务器为单位,sticky模式是以进程为单位的,除此之外还有什么区别么? 跪求官方解答
ip-hash — a hash-function is used to determine what server should be selected for the next request (based on the client’s IP address).
- ip-hash
If you plan to distribute the load of connections among different processes or machines, you have to make sure that requests associated with a particular session id connect to the process that originated them.
- Sticky load balancing
从上面的介绍看,目的其实是相同的,但是 socket.io 支持 WebSocket 和 Long-polling,然后问题来了,如果请求处于两次轮训请求之间,就会有问题了,所以推荐使用 WebSocket。如果你要让保证他们能够实现 Sticky 模式,那要怎么办?答案是:sticky-session,具体怎么用,请阅读官方文档啊~
通常来说,socket.io 部署在一台机器上,所以呢,通过 Nginx 的 ip-hash 来达到负载到指定机器的目的即可,配置如下:
http {
server {
listen 3000;
server_name io.yourhost.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://nodes;
# enable WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
upstream nodes {
# enable sticky session based on IP
ip_hash;
server app01:3000;
server app02:3000;
server app03:3000;
}
}
但我们在 Egg 中是什么情况?多个 worker,相当于用 Node.js Cluster 方式启动,这个怎么玩?文档里其实也写了,链接在下面~
- http://nginx.org/en/docs/http/load_balancing.html
- https://socket.io/docs/using-multiple-nodes/#Sticky-load-balancing
真实的分布式系统中,根据 ip 会异常复杂,也没必要搞那么复杂,分布式 session 怎么处理?
session-redis
这就不得了,请求过来了谁处理并不重要,重要的是能处理就可以了,同理,在玩 socket.io 的时候,也可以不关心是否到达源进程,用 connection 的 id 进行用于标识,连接即创建,断开取消,达到 session 的目的就可以喽~
用egg框架的服务中 启动命令加上了--sticky, 那还需要使用sticky-session模块吗?@thonatos
@dearpeach
搞错,不需要了(避免继续误人子弟,原回复已删)
弄错的地方请打脸,T.T
文档上给的描述让我以为 启动加上了 --sticky,nginx上做一层多机器的转发就ok了 @thonatos
@dearpeach sticky-session 这个模块并没有什么用,在 egg 里面需要开启 --sticky 参数,nginx 按照需要配置即可。 其他的都不需要。
在多集群下,用egg的start启动,start脚本加上了--sticky, 那nginx 的upstream 需要加上 ip_hash吗?@ngot @thonatos
看socket.io官网上教程 老觉得这块有点混乱,求大佬们给打个样。
@thonatos 请问大佬,egg中用socket.io-client 做客户端,是否还需要加 --sticky
@dearpeach 不需要的。
@Jackliu007888 --sticky 是服务端的问题,和用什么客户端没有关系。
@ngot 如果是多机器部署egg服务, 还需要配置nginx ip_hash吗