Go语言实现websocket推送程序

 更新时间:2023年05月18日 17:30:41   作者:永远的麦田  
这篇文章主要介绍了Go语言实现websocket推送程序,WebSocket是基于TCP的一个双向传输数据的协议,和HTTP协议一样,是在应用层的,他的出现,是为了解决网页进行持久双向传输数据的问题

最近要在一个go实现的K线服务器上追加一个websocket推送功能。

初步设想是在各品种每分钟的数据完成后立即向各订阅单位推送对应的K线数据。

一、场景抽象

1用户连接上服务器

2用户订阅某品种的某周期

3用户退订某品种某周期

4用户断开服务器

订阅:

推送:

二、程序框架

由于go语言不熟,幸好网上有人做了成熟的框架:GitHub - gorilla/websocket: A fast, well-tested and widely used WebSocket implementation for Go.这个解决了怎样使用websocket的问题

三、主要业务逻辑

每个连接开两个线程

一个线程进行数据写入writePump,一个线程进行数据读取readPump,每当有客户端连接上服务器后,立即开启这两个线程。

读线程逻辑图:

写线程逻辑图:

程序启动时开一个总控线程func (h *Hub) Run()

此线程用来处理客户端的连接,断开,订阅和向订阅信息的客户端作相应信息的广播。

逻辑图如下:

处理注册

处理注册的逻辑非常简单,只是将客户端的指针放置于指针map中即可,代码如下:

// 注册,客户端连接上来的处理逻辑
func (h *Hub) registerMsg(client *Client) {
	h.clients[client] = true
}

处理注销

注销需要分两步走,首先把客户端指针集合中的对应指针删除,同时删除对应的发送通道。然后遍历内容订阅集合,删除对应的客户端指针的元素,最后,若发现某订阅内容上已经没有任何客户端指针,将其订阅内容一并删除。

程序逻辑如下:

订阅处理

订阅最主要的是订阅关系,我们可以用合约.周期作为key,使用客户端连接上来的指针集作为value,每当有用户订阅某内容时,将相应内容下面的指针集上加上对应此用户的指针即可,订阅关系如下:

推送处理

推送处理分两种类型,一种为用户订阅的数据推送给到他们,一种为心跳包推送给到30秒内没有数据推送或订阅动作的用户。

推送订阅的内容:当用户订阅的类型数据到达时,系统检查此订阅上的用户指针,将数据推送到对应指针的通道中,由各通道自行推送给各自的客户端。

推送心跳包:当某个连接上来的客户端30秒内没有订阅请求或是推送数据,系统将自动推送心跳包,以维持连接不被断开。

到此这篇关于Go语言实现websocket推送程序的文章就介绍到这了,更多相关Go websocket内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手带你走进Go语言之语法基础解析

    手把手带你走进Go语言之语法基础解析

    这篇文章主要介绍了手把手带你走进Go语言之语法基础,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 详解go-zero是如何做路由管理的

    详解go-zero是如何做路由管理的

    go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分,而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的吧
    2023-08-08
  • Golang编写自定义IP限流中间件的方法详解

    Golang编写自定义IP限流中间件的方法详解

    这篇文章给大家详细的介绍了Golang编写自定义IP限流中间件的方法,文章通过代码实例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • Go语言fmt库详解与应用实例(格式化输入输出功能)

    Go语言fmt库详解与应用实例(格式化输入输出功能)

    fmt库是Go语言中一个强大而灵活的库,提供了丰富的格式化输入输出功能,通过本文的介绍和实例演示,相信你对fmt库的使用有了更深的理解,感兴趣的朋友一起看看吧
    2023-10-10
  • Go中的关键字any interface是否会成为历史

    Go中的关键字any interface是否会成为历史

    这篇文章主要为大家介绍了Go中的关键字any interface是否会成为历史的讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang metrics各个指标含义讲解说明

    golang metrics各个指标含义讲解说明

    这篇文章主要为大家介绍了golang metrics各个指标含义讲解说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 聊聊Golang性能分析工具pprof的使用

    聊聊Golang性能分析工具pprof的使用

    对于线上稳定运行的服务来说, 可能会遇到 cpu、mem 利用率升高的问题,那我们就需要使用 pprof 工具来进行性能分析,所以本文就来和大家讲讲pprof的具体使用吧
    2023-05-05
  • 详解如何使用pprof简单检测和修复Go语言中的内存泄漏

    详解如何使用pprof简单检测和修复Go语言中的内存泄漏

    虽然 Go 有自动垃圾回收(GC),它能回收不再被使用的内存,但这并不意味着 Go 程序中不会发生内存泄漏,下面我们就来看看如何使用pprof进行检测和修复Go语言中的内存泄漏吧
    2025-01-01
  • 使用go语言解析xml的实现方法(必看篇)

    使用go语言解析xml的实现方法(必看篇)

    下面小编就为大家带来一篇使用go语言解析xml的实现方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Goland支持泛型了(上机实操)

    Goland支持泛型了(上机实操)

    Go的泛型不是还在设计草图吗?最乐观估计也要2021年8月份。你说Go语言现在都没开发好泛型,你支持这个特性有什么用呢?感兴趣的朋友跟随小编一起看看吧
    2020-12-12

最新评论