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

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使用注意事项连接管理处理断开连接负载均衡监控和维护日志记录定期维护安全最佳实践限流 最后 前言 在项目…...

android动态设置是否允许应用卸载

摘要:通过广播设置全局参数控制应用是否允许卸载,全局参数在Launcher和PackageInstaller两个模块中使用到。此功能可用于MDM后台控制是否允许设备卸载应用。 1. 静态注册广播 由于系统安装和卸载的功能集中在PackageInstaller模块中,为了更…...

【C/C++】每日温度 [ 栈的应用 ] 蓝桥杯/ACM备赛

数据结构考点:栈 题目描述: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0…...

开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程

----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞👍 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…...

基于SpringBoot+Vue实现航空票务管理系统

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容: 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法,模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性,比如容易陷入局部最优,收敛速度慢等,所以改进型的GWO可能通过不同的策略来优化这些…...

高级记事本 Sublime Text 下载与使用教程:附百度网盘地址

一、引言 在编程和文本编辑领域,Sublime Text 被誉为一款功能强大的高级记事本。它以其轻量级、高效、多语言支持等特点,深受开发者和文本工作者的喜爱。本文将详细介绍 Sublime Text 的下载方法、安装步骤、使用技巧,并提供百度网盘下载地址…...

4G核心网的演变与创新:从传统到虚拟化的跨越

4G核心网 随着移动通信技术的不断发展,4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性,也为未来的5G、物联网(LOT)和边缘计算等技术的发展奠定了基础。…...

Jmeter快速实操入门

以下操作需要提前安装了JDK(JDK版本要Java8),并且配置了环境变量。 1、下载Jmeter,下载连接。选择zip版本,解压即可。 2、解压后的文件目录如下。 3、进入bin文件夹,双击ApacheJMeter,运行Jmeter。 4、在测…...

JavaScript中的防抖与节流:提升性能的关键技巧 (1)

文章目录 JavaScript 中的防抖与节流:提升性能的关键技巧一、防抖(Debounce)1.1 概念1.2 应用场景1.3 代码实现 二、节流(Throttle)2.1 概念2.2 应用场景2.3 代码实现2.3.1 时间戳方式2.3.2 定时器方式 三、防抖与节流…...

Java数据类型转换(自动转换和强制转换)

数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。 自动数据…...

【大数据技术】Spark分布式实现词频统计(hadoop+python+spark)

Spark分布式实现词频统计(hadooppythonspark) 搭建完全分布式高可用大数据集群(VMwareCentOSFinalShell) 搭建完全分布式高可用大数据集群(HadoopMapReduceYarn) 本机PyCharm远程连接CentOS虚拟机&#x…...

UMLS初探

什么是UMLS UMLS(Unified Medical Language System,统一医学语言系统),简单来说就是将不同的医学标准统一到一套体系的系统,主要为了医疗系统的统一而构建出的。 UMLS的主要组成部分 Metathesaurus:一个…...

Redis持久化机制详解

为什么需要持久化 Redis通常被作为缓存使用,但是Redis一旦宕机,内存中的数据全部丢失,可能会导致数据库崩溃。如果是从数据库中恢复这些数据就会存在频繁访问数据库和读取速度慢的问题。所以redis实现数据的持久化,是至关重要的。…...

Python 鼠标轨迹 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...

PB-DW-数据窗口-降级-从12.5降级到9.0

PB 数据窗口从125降级到90 供参考,有哪些属性仍然需要删除,请在评论区留言。谢谢。 如果您有更好的工具,能分享给我一份的话,就更好了,感谢。 12.5数据窗口降级9.01- release 12.5; 更改为 release 9;2- 第二行的 d…...

Logo语言的测试开发

Logo语言的测试开发 引言 随着编程教育的不断发展,学习编程的门槛逐渐降低,各种编程语言应运而生。其中,Logo语言作为一种经典的教育编程语言,在培养儿童的逻辑思维和解决问题的能力方面,发挥了重要的作用。本文将深…...

位图的深入解析:从数据结构到图像处理与C++实现

在学习优选算法课程的时候,博主学习位运算了解到位运算的这个概念,之前没有接触过,就查找了相关的资料,丰富一下自身,当作课外知识来了解一下。 位图(Bitmap)是一种用于表示图像的数据结构&…...

Faveo Helpdesk存在目录遍历漏洞(CVE-2024-37700)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

【Pytorch函数】PyTorch随机数生成全解析 | torch.rand()家族函数使用指南

🌟 PyTorch随机数生成全解析 | torch.rand()家族函数使用指南 🌟 📌 一、核心函数参数详解 PyTorch提供多种随机数生成函数(注意:无直接torch.random()函数),以下是常用函数及参数:…...

ML.NET库学习004:ML.NET基础知识复盘

文章目录 ML.NET库学习004:ML.NET基础知识复盘背景简单的 ML.NET 应用程序代码工作流机器学习模型基础进阶 ML.NET 架构构建管道训练模型使用模型 数据模型和架构模型部署 ML.NET库学习004:ML.NET基础知识复盘 学了几个小项目,发现好多方法莫…...

2. UVM的基本概念和架构

文章目录 前言1. UVM的基本概念1.1 UVM的核心组件1.2 UVM的基本架构1.3 UVM的工作流程 2. UVM的架构2.1 UVM的层次结构2.2 UVM的组件交互 3. 总结 前言 首先,得确定UVM的基本概念和架构包含哪些关键部分。我回忆起UVM的核心组件,比如uvm_component、uvm…...

算法10--哈希

哈希 原理经典例题[1. 两数之和](https://leetcode.cn/problems/two-sum/description/)[面试题 01.02. 判定是否互为字符重排](https://leetcode.cn/problems/check-permutation-lcci/description/)[217. 存在重复元素](https://editor.csdn.net/md?not_checkout1&spm1015…...

磁盘文件删除后恢复

磁盘文件删除后,文件数据并未立即消失,只是文件系统的指针被移除,标记该空间为可覆盖。要恢复文件,可以尝试以下方法: 1. 使用数据恢复软件 Recuva:适合Windows,能恢复多种文件类型。PhotoRec…...

STM32 CUBE Can调试

STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …...

Goland 内存逃逸问题

内存逃逸是什么? 在go语言中,内存分配存在两个方式:堆分配;栈分配。 栈分配:是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放。 堆分配:通过 new 或者 make 函…...

我们来学人工智能 -- 本地部署DeepSeek

本地部署DeepSeek 题记思考正题结语 题记 时不待我AI会淘汰各领域一些岗位AI可以精简部门,DP白菜价的落地,2025年会更加明显会AI的淘汰不会AI的第四次工业革命将在中国爆发 全产业链多年数字化建设以DP为代表的全球领先白菜价人工智能在各行各业的普及 …...

【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )

文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...

通过脚本实现自动将标签内容复制到下一个标签文件中

只需要将下面内容运行前 修改文件夹路径(控制修改范围的文件名 不需要的话 就随便写一个不相同的文件名 就行 需要的话就是在这个文件名字之前的会被修改) import os import time # 文件夹路径 image_directory r"C:\Users\Lenovo\Desktop\新建文件夹\images" # 替…...

Elasticsearch+Kibana安装启动与操作教程

在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。本文将为您详细介绍在 Windows 和 Mac 系统上安装、启动 Elasticsearch 和 Kibana 的步骤,以及常用命令和 Ki…...

CSS Overflow 属性详解:控制内容溢出的利器

在前端开发中,处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性,帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性? overflow 属性用于控制当元素的内容…...

什么是XMLHttpRequest?及其详细使用说明

XMLHttpRequest(通常缩写为XHR)是一个JavaScript对象,用于在浏览器和服务器之间进行异步通信。它允许网页在不重新加载整个页面的情况下,向服务器发送请求并接收响应。XHR是Ajax(Asynchronous JavaScript and XML&…...

Chrome浏览器原理及优化

1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...

Vue 3 + Vite + JS 项目中实现组件全局自动化注册的魔法,极致组件自动化注册方案,开发效率飙升300%。

在Vue项目开发中,你是否还在为重复的组件注册代码而烦恼?是否经历过在大型项目中手动维护数百个组件注册的痛苦?本文将揭秘一种革命性的组件自动化注册方案,结合Vite的黑魔法和Vue3的最新特性,让你的开发效率实现质的飞…...

寒假2.8

题解 web:[RoarCTF 2019]Easy Calc 打开,是一个计算界面 看一下源代码,提示设置了WAF,并且有一个calc.php文件 访问一下calc.php文件,得到源码,使用get方式传参赋值给num,设置了黑名单&#x…...

企业如何利用DeepSeek提升网络安全管理水平

企业可以通过深度整合DeepSeek的AI能力,构建智能化、动态化的网络安全防御体系,以应对APT(高级持续性威胁)等复杂攻击。以下是具体策略与实践路径: 1. AI驱动的威胁检测与分析 多模态威胁狩猎 DeepSeek的深度学习技术能…...

C++ libfmt 实战: 高效便捷的格式化库

libfmt 是一个现代化的 C格式化库{fmt}, 具有以下关键特性: 安全性: 受 Python 格式化功能启发, {fmt}为printf系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误.可扩展性: 默认支持格式化大多数标准类型, 包括容器,…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_max_sockets

在 Nginx 的源代码中, ngx_max_sockets 全局变量的声明位于 os/unix/ngx_os.h extern ngx_int_t ngx_max_sockets; 定义在 os/unix/ngx_posix_init.c ngx_int_t ngx_max_sockets; ngx_max_sockets 定义了 Nginx 能够同时使用的最大 Socket 文件描述符数量。它…...

Spring Boot接入Deep Seek的API

1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...

大语言模型实践——基于现有API的二次开发

基于现有的API平台做一些实用的AI小应用。 API服务商:阿里云百炼 云服务器:阿里云(2核2GB) 部署框架:gradio 调用框架:openai 语言:Python (注:若搭建网站或API接口…...

ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

深入探究 Go 语言中的 Fx 框架:依赖注入的强大工具

在软件开发中,依赖注入(Dependency Injection,简称 DI)是一种重要的设计模式,它可以帮助我们降低代码的耦合度,提高代码的可测试性和可维护性。Go 语言作为一门高效、简洁的编程语言,拥有许多优…...

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤: 利用 DeepSeek 生成 PPT 内容: 访问 DeepSeek 官网,完成注册/登录后进入对话界面。输入指令,例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲,需包…...

【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战

【04】Java若依vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战 项目背景 本项目经费43000元,需求文档如下,工期25天,目前已经过了8天,时间不多了&#x…...

【C++】异常

前言 本篇博客我们来看下C有关异常的处理,了解下异常有关的知识 💓 个人主页:小张同学zkf ⏩ 文章专栏:C 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 ​ 目录 1.异常的概念及使用 1.1异…...

Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

金融资产配置

不要放在一个篮子里也不要放在太多篮子里: 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类: 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…...

(done) openMP学习 (Day14: 总结)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…...

音频进阶学习十一——离散傅里叶级数DFS

文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn​)的释义 ∑ n 0 N − 1 e…...