V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lldld
V2EX  ›  问与答

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

  •  
  •   lldld · 2021-04-21 22:15:05 +08:00 · 1313 次点击
    这是一个创建于 1094 天前的主题,其中的信息可能已经有所发展或是发生改变。
    类 IM 系统, 目前用户不多, 所以系统比较简单, 系统的所有消息会广播到所有 websocket 服务器, 用户连接到任一 websocket 服务器, 订阅他需要的频道和消息即可.

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

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