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

WebSocket推送数据快,条数多导致前端卡顿问题解决

WebSocket推送数据快,条数多导致前端卡顿问题解决

  • 前言
  • 方案
    • 优化消息频率
    • 使用高效的数据格式
      • Protobuf 和 MessagePack的对比
    • 启用压缩
    • 前端性能优化
  • WebSocket使用注意事项
    • 连接管理
    • 处理断开连接
    • 负载均衡
    • 监控和维护
    • 日志记录
    • 定期维护
    • 安全最佳实践
    • 限流
  • 最后

前言

在项目中,常常需要前端实时获数据,实现动态刷新的效果。WebSocket 是可选方案之一。在实际情况下,如果WebSocket推送快、数据多,前端处理的压力增加,可能导致前端卡顿的问题。笔者在项目开发中有所遇到,通过本篇文章记录一些可选解决方案,作为技术储备。

方案

优化消息频率

通过减少发送消息的频率来避免网络拥塞和增加延迟。可以使用消息批处理技术,将多个小消息合并为一个大消息,减少传输次数。

使用高效的数据格式

选择高效的数据格式,比如Protobuf或MessagePack,这些二进制格式比JSON或XML更高效,可以减少传输数据的大小,加快序列化和反序列化的速度。但用户的可读性较差。

Protobuf 和 MessagePack的对比

Protocol Buffers(Protobuf)和MessagePack都是流行的二进制序列化格式,它们都具有序列化和反序列化速度快,数据压缩率高,数据文件小等特点。它们各自有不同的特点和优势。以下是它们的一些对比:

1.性能对比

  • 速度:Protobuf通常比MessagePack更快,特别是在处理较大的数据集时。这是因为Protobuf的优化二进制格式和基于模式的方法。
  • 大小:MessagePack被设计为比JSON更紧凑,Protobuf也产生紧凑的数据,但大小可能根据模式和正在序列化的数据而变化。在许多情况下,Protobuf可以实现更好的压缩,尤其是对于复杂的数据结构。

2.易用性
MessagePack的API简单易用,可以快速集成到项目中。
Protobuf需要更复杂的设置和集成过程,可能对开发者来说学习曲线更陡峭。

3.扩展性和模式演变
MessagePack在模式演变和扩展性方面支持有限,这可能限制了它在复杂项目中的实用性。Protobuf支持丰富的模式演变、自定义选项和扩展,为不断发展的数据结构提供了更大的灵活性。

4.语言和平台支持
MessagePack支持广泛的编程语言,适合多样化的项目。Protobuf提供了广泛的语言和平台支持,包括Java、C++、Python和Go等流行语言。

5.人类可读性
MessagePack和Protobuf的序列化数据都不如JSON易于人类阅读,这使得调试和理解序列化数据更具挑战性。

6.类型检查和模式验证
MessagePack的类型检查和模式验证能力有限,可能会导致运行时错误和数据不一致。Protobuf提供强大的类型检查和模式验证,有助于维护系统间的数据一致性。

7.与gRPC的集成
Protobuf与gRPC原生集成,而MessagePack也可以与gRPC集成,但不是原生支持。

8.实际应用案例

  • 当需要一个快速且简单的序列化解决方案,而不需要定义模式时,MessagePack是一个好选择。
  • 对于需要严格数据完整性和版本控制的应用,Protobuf可能更适合。
  • 对于处理复杂数据结构并从模式中受益的应用,Protobuf也是一个不错的选择。
  • 在高性能应用中,速度和大小至关重要时,Protobuf可能是更好的选择。
  • 总结来说,选择MessagePack还是Protobuf取决于的具体需求。如果重视速度和模式管理,Protobuf可能是更好的选择。但如果你需要一个轻量级且易于使用的解决方案,MessagePack可能更适合。

启用压缩

对WebSocket消息启用压缩,这可以显著减少发送的数据量,特别是对于文本密集型负载。

前端性能优化

对于前端性能问题,可以通过缓存、压缩和使用CDN来减少延迟。缓存是一项常用方法,前端可以将消息缓存起来,依次处理。减缓前端还没处理结束前一条数据,后台又推送下一条数据造成的卡顿。

WebSocket使用注意事项

连接管理

设置服务器可以处理的WebSocket并发连接数限制,防止服务器过载,确保每个连接都能高效处理。同时使用连接池来管理和重用连接,减少建立新连接的开销。

处理断开连接

实现策略以优雅地处理断开连接。使用心跳或ping检查连接状态,并在连接丢失时自动重新连接。

负载均衡

使用负载均衡在多台服务器之间分配连接,帮助管理负载,并确保没有单台服务器成为瓶颈。

监控和维护

实施实时监控以跟踪WebSocket连接的性能。使用工具如Grafana和Prometheus来可视化连接数、消息速率和延迟等指标。

日志记录

维护详细的WebSocket活动日志,包括连接事件、错误和消息数据(不包含敏感信息)。定期分析这些日志以识别模式和潜在问题。

定期维护

对WebSocket服务器和基础设施进行定期维护,包括更新软件、优化配置和进行压力测试,确保设置能够处理高峰负载。

安全最佳实践

确保只有授权用户可以建立WebSocket连接。实施强大的认证机制,如基于令牌的认证,以在允许用户连接之前验证用户。

限流

实施限流以控制客户端在一定时间内可以发送的消息数量。限流有助于防止滥用,并确保没有单个客户端能够压垮服务器。

最后

笔者在项目中,是通过将小消息合并,减少消息发送的频次。同时前端缓存数据,依次处理。通过实施上述策略,显著减少前端卡顿现象,提供更流畅的用户体验。

愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

相关文章:

WebSocket推送数据快,条数多导致前端卡顿问题解决

WebSocket推送数据快,条数多导致前端卡顿问题解决 前言方案优化消息频率使用高效的数据格式Protobuf 和 MessagePack的对比 启用压缩前端性能优化 WebSocket使用注意事项连接管理处理断开连接负载均衡监控和维护日志记录定期维护安全最佳实践限流 最后 前言 在项目…...

网络爬虫技术如何影响网络安全的

随着网络的发展和网络爬虫技术的普及,一些人收集某些需要的信息,会使用网络爬虫进行数据抓取。网络爬虫一方面会消耗网络系统的网络资源,同时可能会造成核心数据被窃取,因此对企业来讲如何反爬虫显得非常重要。 一、什么是网络爬…...

基于蒙特卡洛思想生成电动汽车充电负荷曲线

本程序基于蒙特卡洛思想生成电动汽车充电负荷曲线,利用第十一届电工杯所提供的数据(充电开始时间,充电电量,充电功率)得到一万台电动汽车充电负荷曲线。蒙特卡洛只是解决问题的一种思想,本程序可为其他利用…...

Redis深入学习

目录 Redis是什么? Redis使用场景 Redis线程模型 Redis执行命令是单线程的为什么还这么快? Redis持久化 Redis 事务 Key 过期策略 Redis 和 mysql 如何保证数据一致? 缓存穿透 缓存击穿 缓存雪崩 Redis是什么? redis是一…...

kamailio中路由模块汇总

功能模块描述请求路由 (request_route)主要处理进入的SIP请求,包含初步检查、NAT检测、CANCEL请求处理、重传处理等。处理通过REQINIT、NATDETECT、RELAY等子模块的调用。CANCEL处理对CANCEL请求进行处理,包括更新对话状态并检查事务。如果事务检查通过&…...

EasyExcel 导出合并层级单元格

EasyExcel 导出合并层级单元格 一、案例 案例一 1.相同订单号单元格进行合并 合并结果 案例二 1.相同订单号的单元格进行合并2.相同订单号的总数和总金额进行合并 合并结果 案例三 1.相同订单号的单元格进行合并2.相同订单号的商品分类进行合并3.相同订单号的总数和总金额…...

青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要

青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要 一、Django 5Django 5 的主要特性包括: 二、MVT模式三、官方网站四、内置功能数据库 ORM(对象关系映射)用户认证和授权表单处理模板引擎URL 路由缓存框架国际化和本地化安全性功能管…...

Oracle认证大师(OCM)学习计划书

Oracle认证大师(OCM)学习计划书 一、学习目标 Oracle Certified Master(OCM)是Oracle官方认证体系中的最高级别认证,要求考生具备扎实的数据库管理技能、丰富的实战经验以及解决复杂问题的能力。本计划旨在通过系统化的…...

2.7学习

crypto buu-还原大师 仔细阅读题目,这里有一段字符串,但是其中有四个大写字母被替换成了‘?’,那么我们写脚本:首先将四个问号均换成26个大写字母并且组成不同的组合, 所以有四个循环让四个问号都遍历26个…...

oracle ORA-27054报错处理

现象 在oracle执行expdp,rman备份,xtts的时候,由于没有足够的本地空间,只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…...

核显是什么

核显(Integrated Graphics,集成显卡)是指集成在中央处理器(CPU)或者主板上的显卡。与独立显卡不同,核显不需要额外的显卡硬件,而是直接使用系统内存(RAM)和处理器的资源来…...

使用LLaMA Factory踩坑记录

前置条件:电脑显卡RTX 4080 问题:LLaMA-Factory在运行的时候,弹出未检测到CUDA的报错信息 结论:出现了以上的报错,主要可以归结于以下两个方面: 1、没有安装GPU版本的pytorch,下载的是CPU版本…...

在qtcreator中添加片段,提高开发效率。

文件名&#xff1a;text.xml <?xml version"1.0" encoding"utf-8"?> <snippets><!-- 版权声明 --><snippet group"Text" trigger"copyright" id"comment_copyright">/*!* file %{CurrentDocum…...

redis的数据结构介绍(string

redis是键值数据库&#xff0c;key一般是string类型&#xff0c;value的类型很多 string&#xff0c;hash&#xff0c;list&#xff0c;set&#xff0c;sortedset&#xff0c;geo&#xff0c;bitmap&#xff0c;hyperlog redis常用通用命令&#xff1a; keys&#xff1a; …...

ASP.NET Core JWT Version

目录 JWT缺点 方案 实现 Program.cs IdentityHelper.cs Controller NotCheckJWTVersionAttribute.cs JWTVersionCheckkFilter.cs 优化 JWT缺点 到期前&#xff0c;令牌无法被提前撤回。什么情况下需要撤回&#xff1f;用户被删除了、禁用了&#xff1b;令牌被盗用了&…...

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)

根据合宙的AT研发推荐&#xff0c; AT指令基本上也简单看完了&#xff0c;这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发&#xff0c;将以前复杂的设备通讯方式转换成简单的串口编程&#xff0c; 大大简化了产品的硬件设计和软件开发成本&#xff0c;这使得几乎所…...

Reqable使用实践

一、背景 日常开发中&#xff0c;难免要抓取请求数据&#xff0c;查看接口数据&#xff0c;从而更好定位问题&#xff0c;基于这个原因&#xff0c;查找了一些抓包工具&#xff0c;例如&#xff1a; HttpCanary、 Steam 、Fiddler等&#xff0c;不是要钱&#xff0c;就是只对苹…...

【蓝桥杯嵌入式】2_LED

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 74HC573是八位锁存器&#xff0c;当控制端LE脚为高电平时&#xff0c;芯片“导通”&#xff0c;LE为低电平时芯片“截止”即将输出状态“锁存”…...

Flink 调用海豚调度器 SQL 脚本实现1份SQL流批一体化的方案和可运行的代码实例

目录 一、流批一体化概述 二、Flink 与海豚调度器结合实现流批一体化的好处 2.1 代码复用性增强 2.2 开发和维护成本降低 2.3 数据一致性保证 2.4 提高系统的灵活性和可扩展性 三、实现思路步骤 3.1 环境准备 3.2 编写 SQL 脚本并上传到海豚调度器 3.3 实现资源下载功…...

B树详解及其C语言实现

目录 一、B树的基本原理 二、B树操作过程图形化演示 三、B树的应用场景 四、C语言实现B树及示例 五、代码执行结果说明 六、应用实例&#xff1a;文件系统目录索引 七、总结 一、B树的基本原理 B树&#xff08;B-Tree&#xff09; 是一种自平衡的树数据结构&#xff0c;…...

【Go语言快速上手】第二部分:Go语言进阶

文章目录 并发编程goroutine&#xff1a;创建和调度 goroutinechannel&#xff1a;无缓冲 channel、有缓冲 channel、select 语句无缓冲 channel有缓冲 channelselect 语句 sync 包&#xff1a;Mutex、RWMutex、WaitGroup 等同步原语Mutex&#xff1a;互斥锁RWMutex&#xff1a…...

ARM64 Linux 内核学习指南:从基础到实践

前言 ARM64 作为当今主流的处理器架构&#xff0c;被广泛应用于移动设备、嵌入式系统和服务器领域。学习 ARM64 在 Linux 内核中的实现&#xff0c;不仅有助于深入理解操作系统底层机制&#xff0c;还能提升在内核开发、驱动编写、虚拟化等领域的专业能力。 本指南面向对 Lin…...

零基础都可以本地部署Deepseek R1

文章目录 一、硬件配置需求二、详细部署步骤1. 安装 Ollama 工具2. 部署 DeepSeek-R1 模型3. API使用4. 配置图形化交互界面&#xff08;可选&#xff09;5. 使用与注意事项 一、硬件配置需求 不同版本的 DeepSeek-R1 模型参数量不同&#xff0c;对硬件资源的要求也不尽相同。…...

掌握Spring @SessionAttribute:跨请求数据共享的艺术

SessionAttribute注解在Spring中的作用&#xff0c;就像是一个“数据中转站”。 在Web应用中&#xff0c;我们经常需要在多个请求之间共享数据。比如&#xff0c;用户登录后&#xff0c;我们需要在多个页面或请求中保持用户的登录状态。这时&#xff0c;SessionAttribute注解就…...

视频采集卡接口

采集卡的正面有MIC IN、LINE IN以及AUDIO OUT三个接口&#xff0c; MIC IN为麦克风输入&#xff0c;我们如果要给采集到的视频实时配音或者是在直播的时候进行讲解&#xff0c;就可以在这里插入一个麦克风&#xff0c; LINE IN为音频线路输入&#xff0c;可以外接播放背景音乐…...

64【32与64位程序的区别】

很多人可能有一个观念&#xff0c;那就是64位的程序NB&#xff0c;有技术含量&#xff0c;但是要说nb在哪&#xff0c;很多人又说不上来&#xff0c;本节来对这个问题做一个探讨 下图中左边的是加载的64程序&#xff0c;右边的是32位程序&#xff0c; 在上一节课我们已经理解…...

ai智能DeepSeek 在 Cursor 中的配置与应用实践

DeepSeek 是一款高效的深度搜索引擎&#xff0c;能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中&#xff0c;DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用&#xff0c;帮助开发者理解如何在实际开发…...

Deepseek的起源与发展

文章目录 前言一、Deepseek的起源二、DeepSeek的发展脉络三、Deepseek的突破与优势(1)功能强大:核心能力与应用场景(2)性能优势:效率与效果的革命性提升四、Deepseek开源引发关注前言 DeepSeek 在网络安全领域带来的新机遇,DeepSeek 从崭露头角到引领 AI 领域的重大变革,已…...

ubuntu conda运行kivy时报“No matching FB config found”

错误描述&#xff1a;本人使用ubuntu自带的python环境运行kivy是没有问题的&#xff0c;就是在使用conda时发生了错误&#xff0c;去网上寻找报错原因&#xff0c;却一直没有头绪&#xff08;这个问题有诸多问题导致的&#xff0c;不敢说用我的这个方法100%能好&#xff09; 1…...

1-1二分查找

二分查找 1 基础版1.1 算法描述1.2 算法流程图1.3 算法实现1.3.1 Java实现 2 改动版2.1 算法描述2.2 算法流程图2.3 算法实现2.3.1 Java实现 2.4 改进点分析2.4.1 区间定义差异2.4.2 核心改进原理2.4.3 数学等价性证明 3 平衡版3.1 算法描述3.2 算法流程图3.3 算法实现3.3.1 Ja…...