WebSocket 设计思路
WebSocket 设计思路
1. 核心结构体
1.1 Manager (管理器)
// Manager 负责管理所有WebSocket连接
type Manager struct {clients sync.Map // 存储所有客户端连接broadcast chan []byte // 广播消息通道messages chan Message // 消息处理通道config *config.WebSocketConfig // 配置信息
}// 设计思路:
// 1. 使用 sync.Map 存储客户端,保证并发安全
// 2. 使用 channel 进行消息广播,避免并发问题
// 3. 独立的消息处理通道,方便业务层处理消息
// 4. 配置信息可从外部注入,提高灵活性
1.2 Client (客户端)
// Client 表示一个WebSocket客户端连接
type Client struct {conn *websocket.Conn // WebSocket连接manager *Manager // 所属的管理器send chan []byte // 发送消息的通道
}// 设计思路:
// 1. 每个客户端维护自己的WebSocket连接
// 2. 持有manager引用,方便访问全局功能
// 3. 独立的发送通道,实现异步消息发送
1.3 Message (消息)
// Message 定义消息结构
type Message struct {Type string `json:"type"` // 消息类型Data interface{} `json:"data"` // 消息内容ClientID string `json:"-"` // 发送者ID
}// 设计思路:
// 1. 类型字段用于区分不同消息
// 2. 数据字段使用interface{}支持任意类型
// 3. ClientID方便追踪消息来源
2. 核心方法
2.1 连接管理
// 创建管理器
func NewManager(config *config.WebSocketConfig) *Manager {// 初始化管理器实例
}// 处理新的WebSocket连接
func (m *Manager) HandleWebSocket() gin.HandlerFunc {// 1. 验证连接请求// 2. 升级HTTP连接为WebSocket// 3. 创建新的客户端// 4. 启动读写协程
}// 设计思路:
// 1. 工厂方法创建管理器
// 2. 使用中间件处理连接
// 3. 自动管理连接生命周期
2.2 消息收发
// 读取消息
func (c *Client) readPump() {// 1. 设置读取超时// 2. 处理心跳响应// 3. 读取消息并处理// 4. 错误处理和清理
}// 发送消息
func (c *Client) writePump() {// 1. 处理发送队列// 2. 发送心跳// 3. 错误处理
}// 设计思路:
// 1. 独立的读写协程
// 2. 心跳保活机制
// 3. 优雅的错误处理
2.3 消息广播
// 广播消息
func (m *Manager) Broadcast(message []byte) {// 向所有客户端发送消息
}// 发送到指定客户端
func (m *Manager) SendToClient(clientAddr string, message []byte) bool {// 发送消息给特定客户端
}// 设计思路:
// 1. 支持全局广播
// 2. 支持定向发送
// 3. 处理发送失败情况
2.4 消息处理
// 发送结构化消息
func (m *Manager) SendMessage(messageType string, data interface{}) error {// 1. 构造消息结构// 2. 序列化消息// 3. 发送消息
}// 获取消息通道
func (m *Manager) GetMessages() <-chan Message {// 返回只读消息通道
}// 设计思路:
// 1. 统一的消息格式
// 2. 类型安全的发送方法
// 3. 方便的消息订阅机制
3. 工作流程
3.1 连接建立流程
- 客户端发起WebSocket连接请求
- 服务端验证请求并升级连接
- 创建Client实例并存储
- 启动读写协程
3.2 消息处理流程
- 客户端发送消息
- readPump接收并解析消息
- 消息发送到处理通道
- 业务层处理消息
- 需要时广播或回复
3.3 连接断开流程
- 检测到连接断开
- 清理客户端资源
- 从管理器中移除
- 关闭相关通道
4. 设计特点
4.1 并发安全
- 使用sync.Map存储连接
- 通过channel通信
- 避免资源竞争
4.2 可扩展性
- 模块化的设计
- 接口定义清晰
- 易于添加新功能
4.3 健壮性
- 完善的错误处理
- 心跳保活机制
- 资源自动清理
4.4 易用性
- 简单的API设计
- 统一的消息格式
- 丰富的使用示例
相关文章:
WebSocket 设计思路
WebSocket 设计思路 1. 核心结构体 1.1 Manager (管理器) // Manager 负责管理所有WebSocket连接 type Manager struct {clients sync.Map // 存储所有客户端连接broadcast chan []byte // 广播消息通道messages chan Message // 消息处理通道config *config.WebSo…...
Jenkins持续集成与交付安装配置
Jenkins 是一款开源的持续集成(CI)和持续交付(CD)工具,它主要用于自动化软件的构建、测试和部署流程。为项目持续集成与交付功能强大的应用。下面我们来介绍下它的安装与配置。 环境准备 更新系统组件(这…...
ESP32作为Wi-Fi AP模式的测试
一、AP模式的流程 初始化阶段 (Init Phase): 1.1: Main task(主任务)初始化LwIP(轻量级TCP/IP协议栈)。 ESP_ERROR_CHECK(esp_netif_init()); 1.2: 创建和初始化Event task(事件任务)。 ESP_ERROR_CHECK…...
【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息
源码链接: https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL,程序将自动抓取网页内容 二、技术选型与原理 requests 库:这是 Python 中用于发送 HTTP 请求…...
Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)
在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:RIL 概述 1.1 RIL 的定义与作用 1.2 RIL 的发展历程 1.3 RIL 与 Android 系统的关系 第二章:RIL 的架构与工作原理 2.1 RIL 的架构组成 2.2 RIL 的工作原理 2.3 RIL 的接口与协议…...
leetcode_2816. 翻倍以链表形式表示的数字
2816. 翻倍以链表形式表示的数字 - 力扣(LeetCode) 搜先看到这个题目 链表的节点那么多 已经远超longlong能够表示的范围 那么暴力解题 肯定是不可以的了 我们可以想到 乘法运算中 就是从低位到高位进行计算 刚开始 我想先反转链表 然后在计算 然后在进…...
【论文阅读】MAMBA系列学习
Mamba code:state-spaces/mamba: Mamba SSM architecture paper:https://arxiv.org/abs/2312.00752 背景 研究问题:如何在保持线性时间复杂度的同时,提升序列建模的性能,特别是在处理长序列和密集数据(如…...
MySQL教程之:批量使用mysql
在前几节中,您以交互方式使用mysql输入语句并查看结果。您也可以运行mysql批量模式。为此,请将要运行的语句放在文件中,然后告诉mysql从文件中读取其输入: $> mysql < batch-file 如果您在Windows下运行mysql,…...
17_Redis管道技术
Redis管道(Pipeline)技术是一种在 Redis 客户端与服务器之间进行高效数据交互的技术。 1.Redis管道技术介绍 1.1 传统请求响应模式 在传统的请求-响应模式下,客户端每发送一个命令后会等待服务器返回结果,然后再发送下一个命令。这种方式在网络延迟较高的情况下会导致性…...
【LC】3270. 求出数字答案
题目描述: 给你三个 正 整数 num1 ,num2 和 num3 。 数字 num1 ,num2 和 num3 的数字答案 key 是一个四位数,定义如下: 一开始,如果有数字 少于 四位数,给它补 前导 0 。答案 key 的第 i 个数…...
【redis】ubuntu18安装redis7
在Ubuntu 18下安装Redis7可以通过以下两种方法实现:手动编译安装和使用APT进行安装。 Ubuntu 18系统的环境和版本: $ cat /proc/version Linux version 4.15.0-213-generic (builddlcy02-amd64-079) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)…...
d2j-dex2jar classes.dex 执行报错:not support version 问题解决
这个错误是由于 dex2jar 工具不支持你的 classes.dex 文件的版本导致的。通常情况下,这是因为你尝试使用的 dex2jar 版本不支持 Android 较新的 DEX 文件格式(例如 DEX 格式 038 或更新版本)。 解决方法 以下是一些解决此问题的步骤&#x…...
智慧城市应急指挥中心系统平台建设方案
建设背景与目标 智慧城市应急指挥中心系统平台的建设,源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源,实现应急事件的快速响应与高效处置,提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…...
QT鼠标、键盘事件
一、鼠标 鼠标点击 mousePressEvent 鼠标释放 mouseReleaseEvent 鼠标移动 mouseMoveEvent 鼠标双击 mouseDoubleClickEvent 鼠标滚轮 QWheelEvent 二、键盘 键盘按下 keyPressEvent 键盘松开keyReleaseEvent 一、鼠标 #include <QMouseEvent> 鼠标点击 mouse…...
Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案
Ceph 作为 OpenStack 的存储后端 块存储(Cinder 后端) Ceph 的 RBD(RADOS Block Device)模块作为 OpenStack Cinder 服务的后端,为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能,能够满足虚…...
DSP+Simulink——点亮LED灯(TMSDSP28379D)超详细
实现功能:DSP28379D-LED灯闪烁 :matlab为2019a :环境建立见之前文章 Matlab2019a安装C2000 Processors超详细过程 matlab官网链接: Getting Started with Embedded Coder Support Package for Texas Instruments C2000 Processors Overview of Creat…...
Linux 环境下编译安装 OpenCV 4.8.x
在 Linux 环境下编译安装 OpenCV 4.8.x 需要安装一系列依赖库。以下是详细的步骤说明,并附上每个依赖库的作用解释。 1. 环境准备 操作系统 推荐使用 Ubuntu 20.04/22.04 或其他基于 Debian 的 Linux 发行版。 编译器 GCC 9 或更高版本(默认已安装&a…...
phpenc加密程序源码
免费扩展加密程序,类似于sg11加密,支持单个PHP(免费)文件以及批量PHP文件(ZIP压缩包格式)源码加密的保护平台,加密后的源码文件保持原有代码结构,可以跨平台运行,可以运行…...
学英语学Elasticsearch:04 Elastic integrations 工具箱实现对第三方数据源的采集、存储、可视化,开箱即用
📢📢📢: 先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 ingestion 摄取 /ɪnˈdʒɛstʃən/ observability 可观察性 …...
2024.10.12 校招 实习 内推 面经
🛰️ :neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、校招 | 中车电动2025届校园招聘正式启动 校招 | 中车电动2025届校园招聘正式启动 2、校招 | 莱斯信息2025届校园招聘 校招 | 莱斯信息2025届校园招聘 3、招聘 | 中电熊猫2025…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
