去中心化的分布式websocket通信架构演进

朴灿烈づ我的快乐病毒、 2023-01-08 08:25 202阅读 0赞

#去中心化的分布式websocket通信架构演进


概念:

  1. cluster:代表一个集群,集群中有多个节点,集群是去中心化的,字面上理解就是无中心节点,与任何节点连接websocket来通信都是等价的
  2. node: 代表一个节点,是集群中的一个组成元素,也是用户websocket长连接状态下的某个实例
  3. roomId: 房间ID,将用户分组,实现组内用户的消息广播
  4. clientId: 用户ID,用户身份的唯一标识
  5. channelId: node在分布式环境下的唯一标识

需求:

  1. 房间内消息广播,类似群聊

一. 首次设计

  1. 消息发送者使用Redis广播消息给所有node
  2. 每个node接受到消息后解析,过滤并将消息推送人与该节点绑定的clientId上

在这里插入图片描述

问题:

  1. 每个节点需要解析全量消息。在部署了10个node的cluster里,每个node都需要处理10个node的数据,极大的浪费网络传输与数据处理

优化方向:

  1. 每个节点只处理该节点需要的消息

二. 再次设计

  1. 每个node启动时生成本node信息(可能是主机名,可能是IP等),这里叫channelId
  2. node启动成功后向Redis监听该channelId相关的消息,这样就能直接过滤掉不需要的消息,就像对讲机指定频道一样
  3. 当用户建立websocket连接时,向redis添加roomId与channelId一对多的映射关系
  4. 用户A 在向Redis广播时,通过注册表找到该消息需要广播的channelId列表,来完成消息推送

在这里插入图片描述

问题:

  1. roomId -> channelId 注册表生命周期维护问题

    1. 比如用户断开了,需要移除注册表中的通道信息
    2. 比如服务器宕机,需要移除注册表中的通道信息
    3. 比如用户A首次注册在ChannelA上,断线重连后注册在了ChannelB上,就需要执行移除和添加两个操作
    4. 如果首次用户B,C注册在了同一个channel上,用户B断线后重连在了channelA上,那就只需要在注册表中增加一个channelA,不需要删除

    话外音:分布式服务,每个node可能启动在任何机器上,可能不是物理机只是一个docker,因此channelId设定为不会固定

优化方向:

  1. 在redis中维护一个roomId->clientId = channelId 的用户通道明细列表,如下:
  2. 在某个用户信息发生变更时,通过下面的用户通道明细列表,能够刷新roomId->channelId的映射表

在这里插入图片描述

  1. 话外音:不要想着发送消息时直接使用`redis keys(roomId+"*")` 在用户通道明细列表中直接获取该房间的所有通道信息,从而可以忽略房间和通道的映射表,这样效率极低

三. 再次设计

在这里插入图片描述

问题:

  1. Redis中的所有映射信息需要有生命周期,否房间使用后将会不断的产生僵尸数据,不能销毁

优化方向:

  1. 加入过期时间概念,在未使用后自动销毁
  2. 加入心跳概念,确保在使用期间不会被销毁

四. 再次设计

  1. 每一个node都启动一个定时任务,定时刷新该node所属数据的过期时间,这样该node宕机后,相关信息就能得到及时的清理,生命周期也得到了维护
    在这里插入图片描述

问题:

  1. 如果某房间的用户凑巧建立websocket连接在了同一个node上,那Redis广播这一步是否有些多余 - (话外音:局域网概念)
  2. 既然局域网概念可以忽略Redis广播,那能否将局域网概念深挖一下,比如修改nginx路由策略,指定为IP hash,这样客户端侧的局域网能够大概率落在服务侧的同一台node上

四. 最后升华

在这里插入图片描述

最终完整设计图

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读

    相关 分布式架构演进过程

    一、什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统。 内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系

    相关 推荐中心

    个性化推荐系统简单来说是一个将user和item进行匹配的一个系统。个性化推荐系统主要包括召回、排序两个典型模块:召回是指根据用户信息和历史行为,从内容池中获取与之相匹配的部分

    相关 分布式系统架构演进

    技术为业务而生,随着业务不断的壮大,系统会遇到各种各样的瓶颈,为了解决这些瓶颈问题,催生了不同的架构。下面,我讲解一下一般大型分布式系统的架构演进。 ![2017121918