1
hly9469 327 天前 via Android
nginx ,跟 spring 关系不大
|
2
YIsion 327 天前
啊? WebSocket 是有状态的协议,你说的集群的意思应该是指客户端发起请求能连接到一堆服务器中负载压力小的服务器吧。
|
3
seedhk 327 天前
nginx 做负载均衡啊
|
4
m2276699 327 天前
盲猜你是不是在问主动推送不知道怎么推?
|
5
zzzzyg 327 天前
MQ
|
6
liangkang1436 327 天前 via Android
一开始跟客户端建立连接的是哪台服务器,后续就必须一直是这台服务器与此客户端通信,在使用 NGINX 进行反向代理的时候,必须保证这一点,否则,在客户端看来,就会断链,为了保证这一点,可以配置 NGINX 的负载均衡策略,保证来自某一个客户端的请求固定映射到某一台服务器,不过为了保险起见,还是应该用一个回话管理器
|
7
kiracyan 327 天前
你要的应该是网关服务器,然后再动态分配业务服务器
|
8
qinxi 327 天前
自己维护一份 userId 跟服务的映射关系呗. 给他发消息就找映射关系到对应的服务
|
9
dlmy 327 天前
网关,Session 会话管理器,一致性 Hash ?
|
10
jimrok 327 天前
后端用一个 etcd 或者 zookeeper 管理群集,然后根据客户的 id 用算法映射到群集上,引导客户的连接群集使用的 ip 地址和端口,客户就上了船了。如果群集要下线,发送 websocket 的消息给客户,自己断线然后重新查询群集地址,再连接。
|
11
interim 327 天前
先把具体问题抛出来,别把方向整错了。
|
12
yalin 327 天前
我们是 AWS 云上面,结合 API Gateway 和 Spring 一起做的
|
13
monkeyk 327 天前
若是做推送服务,何不尝试用这类小而美的服务呢,https://www.goeasy.io/
|
14
visper 327 天前 2
估计你说的是,集群系统里面,websocket 连接到了其中一台,但是后续任务在其他台运行怎么推送到特定的人。这种需要后台集群间有自己的通讯机制。比如任务发消息了广播到其他集群机器然后直接推送到连到这台机的 websocket 。
|
15
luobingit 327 天前
#14 +1
|
16
ionfev 327 天前
简单实现过,使用 Redis 发布订阅,查资料看到还有 MQ 、Zookeeper 、微服务的服务发现。笔记: https://www.cnblogs.com/ioufev/p/17559480.html
|
17
jorneyr 327 天前 4
这个问题其实主要是解决跨 WebSocket Server 发送消息。
A 在 Server-1 B 在 Server-2 A 要给 B 发送私有消息: 1. A 给 Server-1 发送消息 2. Server-1 收到消息,先在自己的连接列表里找 B 得连接 2.1. 如果找到 B 的连接则直接给 B 发送消息 2.2. 如果没有找到 B 的连接则给所有 WebSocket Server 广播给 B 发送消息 3. WebSocket Server 收到广播,然后查看如果消息是自己广播的则抛弃,不是则执行消息的动作 |
18
Masoud2023 327 天前
这问题我还真没想过,ws 怎么做负载均衡?
|
19
Aresxue 327 天前
这问题想问的是推送,如何把某个用户的信息反向推送到浏览器,浏览器到用户有 nginx 代理 tcp 直接就能找到,这问题说大不大说小不小,简单来说就是维护 user 和 server 的关系,但如果 server 的量级超过 100 就会复杂的多,多活容灾每个细节都值得大费篇章。
|
20
XCFOX 327 天前 2
如果是服务端主动推送的场景的话,可以考虑一下使用消息中间件 NATS: https://nats.io/
NATS 内置了楼上提到的负载均衡、广播等功能。 NATS 能够通过 SDK 与前端、客户端直接连接。 NATS 能够很方便地实现水平扩展,NATS 能够与你的用户权限体系集成。 https://docs.nats.io/running-a-nats-service/configuration/websocket/websocket_conf |
21
pengtdyd 327 天前
那当然是单独的服务啦,无状态和有状态架构上个人认为不能混用(纯个人理解)。
|
22
kuituosi 327 天前
要看具体实现的功能,即使是 websocket 也可以当作临时接入点,所以连接到任意一台就可以
如果是需要持续状态,比如有游戏服务器,就需要保持 session 这种可以采用客户端路由,也可以采用网关 session 路由 |
23
imokkkk 327 天前
Redis 发布订阅
|
24
imokkkk 327 天前
@imokkkk #23 或者 MQ 可以参考这个 https://mp.weixin.qq.com/s/oR1svDjbWa8c-qx1rKn80w
|
25
gitrebase 327 天前
如果要做服务端推送的话,可以考虑使用 Server-Sent Events ,这是种不用维护 WebSocket 的方案,我前几天刚好写了 demo 来用 SSE + NATS 来做轻量级的聊天室服务( NATS 就是用来做集群间的即时 pubsub 的,用 Redis 的 pubsub 应该也行) https://zhuanlan.zhihu.com/p/676561818
|
26
salmon5 327 天前
会话保持,植入 cookie 。
AWS/阿里云 ALB 都支持。 |
27
salmon5 327 天前
AWS 叫 Sticky sessions(粘性会话) Stickiness
|
28
l0wkey 327 天前
换 MQTT 吧
|
29
salmon5 327 天前
https://socket.io/docs/v4/using-multiple-nodes/#nginx-configuration
nginx 社区版不支持基于植入 cookie 的,商业版支持 社区版支持基于源 IP 的,缺点是可能会负载不均匀 |
30
ZeroDu 327 天前
上面说的 mq 发广播这个就是最佳方案了;
或者 redis 保存一份 client 跟 server 的对应关系,后续就可以操作了 |
31
F7TsdQL45E0jmoiG 326 天前
本质是会话保持,另外现在还有什么场景非要用 websocket 的集群
|