lldld
V2EX  ›  问与答

类 IM 系统, 当消息变多时, 想水平扩展 websocket 服务器, 如何设计?

  •  
  •   lldld · Apr 21, 2021 · 2450 views
    This topic created in 1857 days ago, the information mentioned may be changed or developed.
    类 IM 系统, 目前用户不多, 所以系统比较简单, 系统的所有消息会广播到所有 websocket 服务器, 用户连接到任一 websocket 服务器, 订阅他需要的频道和消息即可.

    现在可以预见到消息会变多一个数量级, 每个 websocket 服务器接收整个系统的所有消息不合适了, 应该仅接收此服务器连接的用户所订阅的消息.

    所以系统需要对消费者(websocket), 生产者(产生消息)进行一些管理, 至少要对消息进行过滤 /路由, 有什么可行的成熟方案吗?
    4 replies    2021-04-22 09:44:25 +08:00
    aec4d
        1
    aec4d  
       Apr 21, 2021 via iPhone
    可以试试 socketio 配合消息中间件
    psx2019
        2
    psx2019  
       Apr 22, 2021
    不想写扩散的话,那就模拟服务发现的机制做一个用户路由发现,维护一个在线用户的 session 缓存,里面维护了 session 对应的路由服务器信息,发送的时候根据这个缓存值进行路由,但是需要配合 ack 机制或者其他机制保证消息真的被接受到了。否则应该保存到离线消息表里面等待下次上线拉取消息。
    xstmjh
        3
    xstmjh  
       Apr 22, 2021
    一楼正解
    lldld
        4
    lldld  
    OP
       Apr 22, 2021
    @aec4d
    @psx2019 感谢. 我自己的方案是会用 kafka. 只是毕竟自己要实现消息的过滤和路由等, 想找找看有没有开源的成熟方案.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2841 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:08 · PVG 23:08 · LAX 08:08 · JFK 11:08
    ♥ Do have faith in what you're doing.