nnegier
V2EX  ›  Java

[Spring] WebSocket 怎么做到集群?

  •  1
     
  •   nnegier · Jan 11, 2024 · 7504 views
    This topic created in 1035 days ago, the information mentioned may be changed or developed.
    31 replies  •  2024-01-12 09:55:14 +08:00
    hly9469
    hly9469
    Jan 11, 2024 via Android
    1
    nginx ,跟 spring 关系不大
    YIsion
    YIsion
    Jan 11, 2024
    2
    啊? WebSocket 是有状态的协议,你说的集群的意思应该是指客户端发起请求能连接到一堆服务器中负载压力小的服务器吧。
    seedhk
    seedhk
    Jan 11, 2024
    3
    nginx 做负载均衡啊
    m2276699
    m2276699
    Jan 11, 2024
    4
    盲猜你是不是在问主动推送不知道怎么推?
    zzzzyg
    zzzzyg
    Jan 11, 2024
    5
    MQ
    liangkang1436
    liangkang1436
    Jan 11, 2024 via Android
    6
    一开始跟客户端建立连接的是哪台服务器,后续就必须一直是这台服务器与此客户端通信,在使用 NGINX 进行反向代理的时候,必须保证这一点,否则,在客户端看来,就会断链,为了保证这一点,可以配置 NGINX 的负载均衡策略,保证来自某一个客户端的请求固定映射到某一台服务器,不过为了保险起见,还是应该用一个回话管理器
    kiracyan
    kiracyan
    Jan 11, 2024
    7
    你要的应该是网关服务器,然后再动态分配业务服务器
    qinxi
    qinxi
    Jan 11, 2024
    8
    自己维护一份 userId 跟服务的映射关系呗. 给他发消息就找映射关系到对应的服务
    midsolo
    midsolo
    Jan 11, 2024
    9
    网关,Session 会话管理器,一致性 Hash ?
    jimrok
    jimrok
    Jan 11, 2024
    10
    后端用一个 etcd 或者 zookeeper 管理群集,然后根据客户的 id 用算法映射到群集上,引导客户的连接群集使用的 ip 地址和端口,客户就上了船了。如果群集要下线,发送 websocket 的消息给客户,自己断线然后重新查询群集地址,再连接。
    interim
    interim
    Jan 11, 2024
    11
    先把具体问题抛出来,别把方向整错了。
    yalin
    yalin
    Jan 11, 2024
    12
    我们是 AWS 云上面,结合 API Gateway 和 Spring 一起做的
    monkeyk
    monkeyk
    Jan 11, 2024
    13
    若是做推送服务,何不尝试用这类小而美的服务呢,https://www.goeasy.io/
    visper
    visper
    Jan 11, 2024❤️2
    14
    估计你说的是,集群系统里面,websocket 连接到了其中一台,但是后续任务在其他台运行怎么推送到特定的人。这种需要后台集群间有自己的通讯机制。比如任务发消息了广播到其他集群机器然后直接推送到连到这台机的 websocket 。
    DreamArchitect
    DreamArchitect
    Jan 11, 2024
    15
    #14 +1
    ionfev
    ionfev
    Jan 11, 2024
    16
    简单实现过,使用 Redis 发布订阅,查资料看到还有 MQ 、Zookeeper 、微服务的服务发现。笔记: https://www.cnblogs.com/ioufev/p/17559480.html
    jorneyr
    jorneyr
    Jan 11, 2024❤️4
    17
    这个问题其实主要是解决跨 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 收到广播,然后查看如果消息是自己广播的则抛弃,不是则执行消息的动作
    Masoud2023
    Masoud2023
    Jan 11, 2024
    18
    这问题我还真没想过,ws 怎么做负载均衡?
    Aresxue
    Aresxue
    Jan 11, 2024
    19
    这问题想问的是推送,如何把某个用户的信息反向推送到浏览器,浏览器到用户有 nginx 代理 tcp 直接就能找到,这问题说大不大说小不小,简单来说就是维护 user 和 server 的关系,但如果 server 的量级超过 100 就会复杂的多,多活容灾每个细节都值得大费篇章。
    XCFOX
    XCFOX
    Jan 11, 2024❤️2
    20
    如果是服务端主动推送的场景的话,可以考虑一下使用消息中间件 NATS: https://nats.io/

    NATS 内置了楼上提到的负载均衡、广播等功能。
    NATS 能够通过 SDK 与前端、客户端直接连接。
    NATS 能够很方便地实现水平扩展,NATS 能够与你的用户权限体系集成。

    https://docs.nats.io/running-a-nats-service/configuration/websocket/websocket_conf
    pengtdyd
    pengtdyd
    Jan 11, 2024
    21
    那当然是单独的服务啦,无状态和有状态架构上个人认为不能混用(纯个人理解)。
    kuituosi
    kuituosi
    Jan 11, 2024
    22
    要看具体实现的功能,即使是 websocket 也可以当作临时接入点,所以连接到任意一台就可以
    如果是需要持续状态,比如有游戏服务器,就需要保持 session
    这种可以采用客户端路由,也可以采用网关 session 路由
    imokkkk
    imokkkk
    Jan 11, 2024
    23
    Redis 发布订阅
    imokkkk
    imokkkk
    Jan 11, 2024
    24
    gitrebase
    gitrebase
    Jan 11, 2024
    25
    如果要做服务端推送的话,可以考虑使用 Server-Sent Events ,这是种不用维护 WebSocket 的方案,我前几天刚好写了 demo 来用 SSE + NATS 来做轻量级的聊天室服务( NATS 就是用来做集群间的即时 pubsub 的,用 Redis 的 pubsub 应该也行) https://zhuanlan.zhihu.com/p/676561818
    salmon5
    salmon5
    Jan 11, 2024
    26
    会话保持,植入 cookie 。
    AWS/阿里云 ALB 都支持。
    salmon5
    salmon5
    Jan 11, 2024
    27
    AWS 叫 Sticky sessions(粘性会话) Stickiness
    l0wkey
    l0wkey
    Jan 11, 2024
    28
    换 MQTT 吧
    salmon5
    salmon5
    Jan 11, 2024
    29
    https://socket.io/docs/v4/using-multiple-nodes/#nginx-configuration
    nginx 社区版不支持基于植入 cookie 的,商业版支持
    社区版支持基于源 IP 的,缺点是可能会负载不均匀
    ZeroDu
    ZeroDu
    Jan 11, 2024
    30
    上面说的 mq 发广播这个就是最佳方案了;
    或者 redis 保存一份 client 跟 server 的对应关系,后续就可以操作了
    F7TsdQL45E0jmoiG
    F7TsdQL45E0jmoiG
    Jan 12, 2024
    31
    本质是会话保持,另外现在还有什么场景非要用 websocket 的集群
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2996 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 05:25 · PVG 13:25 · LAX 21:25 · JFK 00:25
    ♥ Do have faith in what you're doing.