[eggjs/egg]egg-socket.io 中的sticky模式和nginx配置ip_hash的区别

2025-11-20 825 views
0

按文档说的,egg-socket.io的sticky模式是为了解决cluster的问题,那么这跟nginx配置反向代理时的ip_hash有什么区别吗?

回答

6

@ngot

7

经过实测,sticky模式没用,真的,我经过测试发现还是有连接不在一个进程上

1

我所理解的是 ip_hash是以服务器为单位,sticky模式是以进程为单位的,除此之外还有什么区别么? 跪求官方解答

5

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 支持 WebSocketLong-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 方式启动,这个怎么玩?文档里其实也写了,链接在下面~

真实的分布式系统中,根据 ip 会异常复杂,也没必要搞那么复杂,分布式 session 怎么处理?

session-redis

这就不得了,请求过来了谁处理并不重要,重要的是能处理就可以了,同理,在玩 socket.io 的时候,也可以不关心是否到达源进程,用 connection 的 id 进行用于标识,连接即创建,断开取消,达到 session 的目的就可以喽~

8

用egg框架的服务中 启动命令加上了--sticky, 那还需要使用sticky-session模块吗?@thonatos

0

@dearpeach

搞错,不需要了(避免继续误人子弟,原回复已删)

弄错的地方请打脸,T.T

4

文档上给的描述让我以为 启动加上了 --sticky,nginx上做一层多机器的转发就ok了 @thonatos

2

@dearpeach sticky-session 这个模块并没有什么用,在 egg 里面需要开启 --sticky 参数,nginx 按照需要配置即可。 其他的都不需要。

1

在多集群下,用egg的start启动,start脚本加上了--sticky, 那nginx 的upstream 需要加上 ip_hash吗?@ngot @thonatos

看socket.io官网上教程 老觉得这块有点混乱,求大佬们给打个样。

1

@thonatos 请问大佬,egg中用socket.io-client 做客户端,是否还需要加 --sticky

5

@dearpeach 不需要的。

2

@Jackliu007888 --sticky 是服务端的问题,和用什么客户端没有关系。

1

@ngot 如果是多机器部署egg服务, 还需要配置nginx ip_hash吗