当前位置: 首页 > news >正文

WebSocket实现分布式的不同方案对比

引言

随着实时通信需求的日益增长,WebSocket作为一种基于TCP的全双工通信协议,在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而,在分布式环境下,如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几种常见的WebSocket分布式实现方案,包括基于消息队列的广播模式、基于Redis缓存的路由模式、以及基于哈希环的实现方案,探讨它们的优缺点及适用场景。

方案一:基于消息队列的广播模式

实现原理

该方案将消息(包括用户ID和消息内容)统一推送到一个消息队列(如Redis、Kafka等)的特定主题(topic)中。每个应用节点都订阅这个主题,当接收到WebSocket消息后,取出消息中的“消息接收者的用户ID/用户名”,然后比对自身是否存在相应用户的连接。如果存在,则推送消息;否则,丢弃接收到的消息(由消息接收者所在的应用节点处理)。

优缺点

  • 优点

    • 实现简单,易于扩展。
    • 消息队列可以解耦消息的生产者和消费者,提高系统的可靠性和可维护性。
  • 缺点

    • 网络流量较大,因为每个节点都会接收到所有消息,然后进行筛选。
    • 消息队列的可靠性和性能可能会影响整个系统的稳定性和响应速度。

实现步骤

  1. 定义一个WebSocket Channel枚举类,用于标识不同的消息类型。
  2. 配置基于Redis的消息队列,包括连接池配置、消息发布和订阅配置等。
  3. 在Controller中发送WebSocket消息到消息队列。
  4. 每个应用节点订阅消息队列,并处理接收到的消息。
方案二:基于Redis缓存的路由模式

实现原理

在用户建立WebSocket连接后,使用Redis缓存记录用户的WebSocket连接建立在哪个应用节点上。然后,使用消息队列将消息推送到接收者所在的应用节点上。该方案比方案一复杂,但网络流量更低。

优缺点

  • 优点

    • 网络流量较低,因为只有接收者所在的应用节点会接收到消息。
    • 可以灵活地管理用户的WebSocket连接信息。
  • 缺点

    • 实现复杂,需要维护Redis缓存和消息队列的同步。
    • 如果Redis缓存或消息队列出现故障,可能会影响整个系统的消息推送功能。

实现步骤

  1. 在用户建立WebSocket连接时,将连接信息存储到Redis缓存中。
  2. 使用消息队列将消息推送到接收者所在的应用节点。
  3. 接收者所在的应用节点从Redis缓存中获取用户的WebSocket连接信息,并推送消息。
方案三:基于哈希环的实现方案

实现原理

哈希环是一种分布式算法,通过哈希函数将用户ID映射到环上的某个节点,从而实现用户与WebSocket服务器的关联。当有消息需要发送给某个用户时,首先通过哈希函数找到该用户对应的WebSocket服务器,然后将消息推送到该服务器上。该方案可以有效减少消息广播带来的网络流量,并提高消息传递的效率。

优缺点

  • 优点

    • 网络流量低,因为只有接收者所在的服务器会接收到消息。
    • 负载均衡效果好,可以通过调整哈希环的节点数量来适应不同的负载情况。
  • 缺点

    • 实现复杂,需要深入理解哈希环的原理和实现。
    • 当节点动态增加或减少时,需要重新计算哈希环并重新分配用户。

实现步骤

  1. 配置哈希环算法,定义哈希函数和节点映射规则。
  2. 在用户建立WebSocket连接时,通过哈希函数找到对应的WebSocket服务器,并将连接信息存储到该服务器上。
  3. 当有消息需要发送时,通过哈希函数找到接收者所在的WebSocket服务器,并将消息推送到该服务器上。
方案对比
方案实现原理优缺点适用场景
基于消息队列的广播模式将消息推送到消息队列,每个节点订阅并处理消息实现简单,易于扩展;网络流量较大适用于对实时性要求较高,但网络带宽充足的场景
基于Redis缓存的路由模式使用Redis缓存记录用户的WebSocket连接信息,将消息推送到接收者所在的应用节点网络流量较低;实现复杂适用于对实时性和网络带宽都有一定要求的场景
基于哈希环的实现方案通过哈希函数将用户ID映射到WebSocket服务器,实现消息的路由和推送网络流量低,负载均衡效果好;实现复杂适用于对实时性、网络带宽和负载均衡都有较高要求的场景
结论

在选择WebSocket分布式实现方案时,需要根据具体的应用场景和需求进行权衡。如果对实时性要求较高,且网络带宽充足,可以选择基于消息队列的广播模式;如果对实时性和网络带宽都有一定要求,且希望减少消息广播带来的网络流量,可以选择基于Redis缓存的路由模式;如果对实时性、网络带宽和负载均衡都有较高要求,可以选择基于哈希环的实现方案在实际应用中,还可以根据系统的具体情况进行组合和优化,以达到最佳的效果。

相关文章:

WebSocket实现分布式的不同方案对比

引言 随着实时通信需求的日益增长,WebSocket作为一种基于TCP的全双工通信协议,在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而,在分布式环境下,如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几…...

基于注意力机制的端到端合成语音检测

End-to-end Synthetic Speech Detection Based on Attention Mechanism 摘要: 五种轻量级注意力模块改为适用于语音序列的 通道注意力机制和 一维空间注意力机制 ASVspoof2019测试集的 等错误率和 最小串联检测代价函数都有所降低 池化层之前嵌入CBAM、ECA的模型测试…...

MySQL NaviCat 安装及配置教程(Windows)【安装】

文章目录 一、 MySQL 下载 1. 官网下载2. 其它渠道 二、 MySQL 安装三、 MySQL 验证及配置四、 NaviCat 下载 1. 官网下载2. 其它渠道 五、 NaviCat 安装六、 NaviCat 逆向工程 软件 / 环境安装及配置目录 一、 MySQL 下载 1. 官网下载 安装地址:https://www.m…...

微信小程序:播放音频

在小程序开发中,音频播放是一个重要的功能。本文将详细介绍小程序音频播放的相关知识点,帮助开发者更好地掌握小程序音频播放的实现方法。 一、小程序音频播放的基本流程 在小程序中,音频播放的基本流程如下: 获取音频数据&#…...

Ubuntu安装K8S

第一步: 安装docker Install Docker #注意docker是早期的名称已经过时了,因此请使用如下命令,一步到位安装docker-ce。 第二步:设置K8S源: (大陆使用aliyun源,大陆外使用google源)…...

独立同分布时,联合概率密度函数等于边缘概率密度函数乘积

在概率论中,独立同分布(i.i.d.)指的是多个随机变量既独立又服从相同的概率分布。对于一组随机变量 (X_1, X_2, \dots, X_n),若它们是独立同分布的,那么它们的联合概率密度函数 (p(x_1, x_2, \dots, x_n)) 就可以表示为…...

半导体数据分析: 玩转WM-811K Wafermap 数据集(三) AI 机器学习

前面我们已经通过两篇文章,一起熟悉了WM-811K Wafermap 数据集,并对其中的一些数据进行了调用,生成了一些统计信息和图片。今天我们接着继续往前走。 半导体数据分析: 玩转WM-811K Wafermap 数据集(二) AI…...

【.net core】【sqlsugar】时间查询示例

1、时间包含查询示例 //model.TimeInterval为时间区间参数,参数格式为2024-01-01~2025-01-01 //query为当前查询的语句内容 //为当前查询语句增加创建时间模糊搜索查询条件 query query.Where(a > ((DateTime)a.F_CreatorTime).ToString("yyyy-MM-dd HH:m…...

Kotlin 协程基础十 —— 协作、互斥锁与共享变量

Kotlin 协程基础系列: Kotlin 协程基础一 —— 总体知识概述 Kotlin 协程基础二 —— 结构化并发(一) Kotlin 协程基础三 —— 结构化并发(二) Kotlin 协程基础四 —— CoroutineScope 与 CoroutineContext Kotlin 协程…...

Java中网络编程的学习

目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址(Internet Protocol Address) 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤: 服务器程序…...

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…...

【0393】Postgres内核 checkpointer process ③ 构建 WAL records 工作缓存区

1. 初始化 ThisTimeLineID、RedoRecPtr 函数 InitXLOGAccess() 内部会初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局变量。 下面是这四个变量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…...

正则表达式基础知识及grep、sed、awk常用命令

文章目录 前言一、正则表达式元字符和特性1. 字符匹配2. 量词3. 字符类4. 边界匹配5. 分词和捕获6. 特殊字符7. 位置锚定 二、grep常用参数1. -n额外输出行号2. -v 排除匹配的行3. -E 支持扩展正则匹配4. -e进行多规则匹配搜索5. -R 递归匹配目录中的文件内容6. -r递归地搜索目…...

redhat安装docker 24.0.7

1、下载docker镜像包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz 2、解压 tar -xvf docker-24.0.7.tgz 3、解压的docker文件夹全部移动至/usr/bin目录 cd docker cp -p docker/* /usr/bin 4、注册服务 vi /usr/lib/systemd/syste…...

【excel】VBA简介(Visual Basic for Applications)

文章目录 一、基本概念二、语法2.1 数据类型2.11 基本数据类型2.12 常量2.13 数组 2.2 控制语句2.21 条件语句2.22 循环语句2.23 错误处理&#xff1a;On Error2.24 逻辑运算 2.3 其它语句2.31 注释2.32 with语句 2.4 表达式2.41 常见表达式类型2.42 表达式的优先级 2.5 VBA 的…...

【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍为什么self-attention可以堆叠多层,这有什么作用?

【大厂面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍为什么self-attention可以堆叠多层&#xff0c;这有什么作用&#xff1f; 【大厂面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍为什么self-attention可以堆叠…...

NanoKVM简单开箱测评和拆解,让普通电脑实现BMC/IPMI远程管理功能

Sipeed推出了NanoKVM&#xff0c;简直是没有BMC的台式机和工作站的福音。有了这个就可以轻松实现以往服务器才有的远程管理功能。 NanoKVM 简介 Lichee NanoKVM 是基于 LicheeRV Nano 的 IP-KVM 产品&#xff0c;继承了 LicheeRV Nano 的极致体积 和 强大功能。 NanoKVM 包含…...

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…...

VSCode的配置与使用(C/C++)

从0开始教你在vscode调试一个C文件 一.首先是配置你的编译环境&#xff0c;添加到环境变量&#xff08;默认你是全新的电脑&#xff0c;没有安装vs2019之类的&#xff09; 原因&#xff1a;因为相比于vs2019&#xff0c;vscode只是个代码编辑器&#xff0c;相当于一个彩色的、…...

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...