Go语言实现长连接并发框架 - 请求分发器
文章目录
- 前言
- 接口
- 结构体
- 接口实现
- 项目地址
- 最后
前言
你好,我是醉墨居士,我们上篇博客实现了任务管理器的功能,接下来这篇博客我们将要实现请求分发模块的开发
接口
trait/dispatcher.go
type Dispatcher interface {Start()Dispatch(connQueue chan Connection)BatchDispatch(conn Connection) errorSetHeaderDeadline(deadline time.Time)SetBodyDeadline(deadline time.Time)ChooseQueue(conn Connection) chan <- ConnectionCommit(conn Connection)
}
结构体
gcore/dispatcher.go
// Dispatcher 请求分发模块,负责读取客户端连接的数据,并对数据进行拆包转换成消息格式,然后分发给下游的任务处理模块对消息进行业务处理
type Dispatcher struct {headerDeadline time.TimebodyDeadline time.TimeconnQueue []chan trait.ConnectiontaskMgr trait.TaskMgr
}// NewDispatcher 创建一个请求分发器
func NewDispatcher(taskMgr trait.TaskMgr) *Dispatcher {connQueue := make([]chan trait.Connection, global.Config.DispatcherQueues)for i := 0; i < len(connQueue); i++ {connQueue[i] = make(chan trait.Connection, global.Config.DispatcherQueueLen)}return &Dispatcher{connQueue: connQueue,taskMgr: taskMgr,}
}
接口实现
gcore/dispatcher.go
// Start 启动请求分发模块
func (d *Dispatcher) Start() {for i := 0; i < len(d.connQueue); i++ {for j := 0; j < global.Config.DispatcherQueueLen; j++ {go d.Dispatch(d.connQueue[i])}}
}// StartDispatcher 分发连接数据
func (d *Dispatcher) Dispatch(connQueue chan trait.Connection) {// 从conn中读取数据,并将数据提交给taskMgr处理for conn := range connQueue {d.BatchDispatch(conn)}
}// BatchDispatch 批量读取连接中的数据,并封装成请求,然后分发请求
func (d *Dispatcher) BatchDispatch(conn trait.Connection) error {for time.Now().After(d.headerDeadline) {header := make([]byte, 4)// 设置header读取超时时间conn.SetReadDeadline(d.headerDeadline)_, err := io.ReadFull(conn, header)if err != nil {if netErr, ok := err.(net.Error); ok && netErr.Timeout() {// 数据包读取超时return nil}return err}// 设置body读取超时时间conn.SetReadDeadline(d.bodyDeadline)// 读取长度dataLen := binary.BigEndian.Uint16(header[2:4])// 读取数据body := make([]byte, dataLen) _, err = io.ReadFull(conn, body)if err != nil {return err}msg := gpack.Unpack(header, body)// 提交消息,处理数据request := NewRequest(conn, msg)d.taskMgr.Submit(request)}return nil
}// SetHeaderDeadline 设置header读取超时时间
func (d *Dispatcher) SetHeaderDeadline(deadline time.Time) {d.headerDeadline = deadline
}// SetBodyDeadline 设置body读取超时时间
func (d *Dispatcher) SetBodyDeadline(deadline time.Time) {d.bodyDeadline = deadline
}// ChooseQueue 选择处理连接的队列
func (d *Dispatcher) ChooseQueue(conn trait.Connection) chan <- trait.Connection {// 负载均衡,选择队列return d.connQueue[conn.ID() % int32(len(d.connQueue))]
}// Commit 提交连接到队列
func (d *Dispatcher) Commit(conn trait.Connection) {d.ChooseQueue(conn) <- conn
}
项目地址
Github:https://github.com/zm50/gte
Giee:https://gitee.com/zm50/gte
最后
我是醉墨居士,我们完成了基本的请求分发器的开发,希望对你有所帮助,也希望你有所收获
相关文章:
Go语言实现长连接并发框架 - 请求分发器
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了任务管理器的功能,接下来这篇博客我们将要实现请求分发模块的开发 接口 trait/dispatcher.go type Dispatcher interface {Start()Dispatch(conn…...
Redis: 集群测试和集群原理
集群测试 1 ) SET/GET 命令 测试 set 和 get 因为其他命令也基本相似,我们在 101 节点上尝试连接 103 $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376我们在插入或读取一个 key的时候,会对这个key做一个hash运算,…...
问题解决实录 | bash 中 tmux 颜色显示不全
点我进入博客 如下图,tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入: touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …...
古典舞在线交流平台:SpringBoot设计与实现详解
摘 要 随着互联网技术的发展,各类网站应运而生,网站具有新颖、展现全面的特点。因此,为了满足用户古典舞在线交流的需求,特开发了本古典舞在线交流平台。 本古典舞在线交流平台应用Java技术,MYSQL数据库存储数据&#…...
五子棋双人对战项目(6)——对战模块(解读代码)
目录 一、约定前后端交互接口的参数 1、房间准备就绪 (1)配置 websocket 连接路径 (2)构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 (1)“落子” 请求对象 (2)“落子…...
查缺补漏----I/O中断处理过程
中断优先级包括响应优先级和处理优先级,响应优先级由硬件线路或查询程序的查询顺序决定,不可动态改变。处理优先级可利用中断屏蔽技术动态调整,以实现多重中断。下面来看他们如何运用在中断处理过程中: 中断控制器位于CPU和外设之…...
Java API接口开发规范
文章目录 一、命名规范1.1 接口命名1.2 变量命名 二、接收参数规范2.1 请求体(Body)2.2 查询参数(Query Parameters) 三、参数检验四、接收方式规范五、异常类处理六、统一返回格式的定义七、API接口的幂等性(Idempote…...
Go语言实现长连接并发框架 - 任务管理器
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了路由分组的功能,接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…...
【大数据】深入解析分布式数据库:架构、技术与未来
目录 1. 分布式数据库的定义2. 架构类型2.1 主从架构2.2 同步与异步复制2.3 分片架构 3. 技术实现3.1 一致性模型3.2 CAP理论3.3 数据存储引擎 4. 应用场景5. 选择分布式数据库的因素5.1 数据一致性需求5.2 读写负载5.3 成本5.4 技术栈兼容性 6. 未来发展趋势总结 分布式数据库…...
uniapp框架中实现文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
前言 uni-file-picker是uniapp中的一个文件选择器组件,用于选择本地文件并返回选择的文件路径或文件信息。该组件支持选择单个文件或多个文件,可以设置文件的类型、大小限制,并且可以进行文件预览。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-file-picker组件具…...
GEE教程:NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况
目录 简介 NASA/GRACE/MASS_GRIDS/LAND 函数 first() Arguments: Returns: Image 代码 结果 简介 利用NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况。 NASA/GRACE/MASS_GRIDS/LAND NASA/GRACE/MASS_GRIDS/LAND数据是由NASA的重力恒星MASS数据…...
世邦通信股份有限公司IP网络对讲广播系统RCE
漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳,传输距离有限,缺乏互动等问题。该系统设备使用简便,…...
爬虫——爬取小音乐网站
爬虫有几部分功能??? 1.发请求,获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意:开始爬虫前,需要给其封装 headers {User-…...
5G NR SSB简介
文章目录 SSB介绍SSB波束扫描 SSB介绍 5G NR 引入了SSB 这个概念,同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB) 它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH…...
java将mysql表结构写入到word表格中
文章目录 需要的依赖 需要的依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version> </dependency> <!--07版本的,行数不受限制--> <dependency>&l…...
SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)
SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境) 前言如何安装Docker Desktop资源下载安装启动(重点)1. 检查 bcdedit的hypervisorlaunchtype是否为Auto2. 检查CPU是否开启虚拟化3.…...
day2网络编程项目的框架
基于终端的 UDP云聊天系统 开发环境 Linux 系统GCCUDPmakefilesqlite3 功能描述 通过 UDP 网络使服务器与客户端进行通信吗,从而实现云聊天。 Sqlite数据库 用户在加入聊天室前,需要先进行用户登录或注册操作,并将注册的用户信息…...
C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解
🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 前面说过纹理贴图能够大幅提升游戏画面质量,但纹理贴图是没有叠加的。在一些游戏场景中,要求将非常不同的多个纹理(如泥泞的褐色地面、绿草植密布的地面、碎石遍布的地面)叠加(混合)起来显示,实现纹理间能够…...
探索云计算中的 Serverless 架构:未来的计算范式?
目录 引言 一、Serverless架构概览 二、Serverless 架构的优势 三、Serverless架构的挑战 四、Serverless架构的未来展望 五、结论 引言 在当今快速发展的 IT 行业中,云计算无疑占据了举足轻重的地位。随着技术的不断演进,云计算的一个新兴分支——…...
爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析
作品详情 运用Hadoop和MongoDB对得分能力数据进行分析; 运用python进行机器学习的模型调理,利用Pytorch框架对爬取的评论进行情感分析预测; 利用python和MySQL对网站的数据进行爬取、数据清洗及可视化。...
工业自动化设备电流检测解决方案——工业控制系统为什么越来越重视隔离电流检测
在工业自动化设备中,电流检测已经成为控制系统的重要组成部分。无论是PLC控制柜、伺服驱动器、工业电源、机器人控制系统还是变频器系统,控制器都需要实时获取负载电流信息,用于过流保护、闭环控制、功率计算以及设备状态监测。但很多工程师在…...
在 Elasticsearch 中,存储向量查询速度最高提升 3 倍
作者:来自 Elastic Benjamin Trent Elasticsearch 9.4 提供了一种更简单的方式来搜索存储在 Elasticsearch 索引中的向量,并将延迟最高降低 3 倍。 从向量搜索到强大的 REST API,Elasticsearch 为开发者提供了最全面的搜索工具集。深入体验 E…...
Tomcat DefaultServlet MIME类型处理缺陷导致信息泄露
1. 这个漏洞不是“能读文件”那么简单,而是Tomcat在特定配置下主动把不该暴露的内部状态当HTTP响应发出去了CVE-2024-21733这个编号刚出来时,我第一反应是又一个“目录遍历”或“文件读取”类的老套路。但真正花半天时间搭环境复现、抓包分析、翻Tomcat源…...
基于Rust与Skia构建高性能跨平台文本编辑器的架构设计与实现
1. 项目概述:为什么我们需要一款“超越者”?在程序员和文本工作者的日常工具箱里,文本编辑器占据着举足轻重的地位。它不像IDE那样庞大臃肿,却需要具备处理代码、日志、配置文件的强大能力。长久以来,Notepad以其轻量、…...
仅剩最后47个印尼语专属Voice ID配额!ElevenLabs企业版印尼语音定制通道即将关闭——附2024Q3合规接入白皮书
更多请点击: https://codechina.net 第一章:印尼语Voice ID配额告急与企业定制通道关闭预警 近期,多家使用印尼语(Bahasa Indonesia)语音身份验证(Voice ID)服务的企业客户收到平台侧自动通知&…...
周村区哪家烧烤好吃?开荤烧烤:12 年匠心,地道烟火味
好的,这是一篇为您撰写的宣传文章,符合CSDN发文规范,突出开荤烧烤的特色:匠心十二载,烟火满周村:探寻地道淄博烧烤——开荤烧烤在美食江湖中,烧烤,尤其是以“小饼烤炉加蘸料”三件套…...
液压液水解安定性检测:核心原理与全行业应用场景解析
液压系统是各类工业、工程、交通设备的动力核心,而液压液作为系统的工作介质,其性能稳定性直接决定设备的运行精度、故障率以及使用寿命。在复杂工况中,水分侵入是导致液压液失效的核心诱因之一,油液遇水发生水解反应后࿰…...
Unity预加载:减少游戏中首次加载资源时的卡顿
遇到的问题,如标题所示,所以写了如下模块。模块功能就是初始化时候,加载零散/文件夹的物体,代码如下:#region 启动预加载模块/// <summary> 预加载间隔(分帧防卡顿) </summary>priv…...
AI API 中转站完全指南:从 Claude、GPT 到“满血”“翻车”,一次搞懂整个 AI API 圈子
如果你刚开始接触 AI API,大概率会在各种开发者群、论坛或者教程里看到一堆让人摸不着头脑的词,比如“满血”“阉割”“翻车”“官转”“上车”“池子”“逆向”等等。很多新人第一次看这些内容的时候,基本都是每个字都认识,但连在…...
终极指南:如何用Continue实现AI驱动的代码检查与PR自动化审查
终极指南:如何用Continue实现AI驱动的代码检查与PR自动化审查 【免费下载链接】continue ⏩ Source-controlled AI checks, enforceable in CI. Powered by the open-source Continue CLI 项目地址: https://gitcode.com/GitHub_Trending/co/continue Contin…...
