美文网首页
go语言socket框架之心跳处理

go语言socket框架之心跳处理

作者: xyt001 | 来源:发表于2018-09-22 15:16 被阅读0次

前言:

本次我们来讲解怎么在自己的框架里面增加心跳处理。已经把所有代码整合了,希望给个星星支持一下 microSocket

心跳处理的必要性:

服务端需要同时处理上千甚至上万的客户端的连接,所以每个连接资源都是很宝贵的,当客户端断开连接的时候服务端应该及时移除该连接。
正常情况下,客户端断开连接的时候,会和服务端进行四次挥手,服务端就会知道这个连接 已经不能用了优雅的退出监听消息。但是总会有意外,比如客户端忽然断网了,没电了,这个时候客户端肯定不可能按照流程和 服务端进行挥手,不知道消息的 服务端还傻傻的在哪儿等着,不知道客户端早就走了
这个时候 心跳包就很完美的解决了此问题。客户端和服务端约定好每隔一段时间 就会发消息,如果服务端每过一段时间没有收到客户端 的心跳消息 就说明 客户端出事了,服务端就删除此连接,确保 资源最大化。
一般心跳包就是 符合该协议的 最小包

实现思路:

一般的go语言框架都是一个连接单独开一个协程 去处理读取超时问题,我承认协程是很廉价,但是总不至于这么浪费吧,当协程数量多到一定程度的时候,协程之间的调度也是一个很大的 消耗,所以我没有采用这种思路。
经过我的苦思冥想终于被我想到了自认为比较好的方法,实现了,一个协程 进行 心跳检测。

  • . 每当一个连接成功接收到消息的时候,就在该连接对象 上设置当前时间戳。来保存最近一次接收消息的时间
  • . 在框架启动的时候就开启一个协程 ,每隔一段时间就遍历 当前所有连接对象 ,如果当前时间 减去 连接对象里的最近接收时间 超过心跳时间,就说明 该连接 已经死了就执行删除

代码实现:

//这是每个连接对象 每次接收到消息就会更新times为当前时间戳
type Session struct {
    Id    uint32
    Con   net.Conn
    times int64
    lock  sync.Mutex
}
//这是更新时间函数
func (this *Session)UpdateTime(){
    this.times = time.Now().Unix()
}
//---------------------------------------------------SESSION管理类------------------------------------------------------

type SessionM struct {
    sessions map[uint32]*Session
    num      uint32
    lock     sync.RWMutex
    isWebSocket bool
    ser     *Msf
}
//心跳检测   每秒遍历一次 查看所有sess 上次接收消息时间  如果超过 num 就删除该 sess
func (this *SessionM)HeartBeat(num int64){
    for {
        time.Sleep(time.Second)
        for i,v:= range this.sessions{
            if time.Now().Unix() - v.times > num {
                this.DelSessionById(i)
            }
        }
    }
}

当框架启动的时候就开一个协程

go this.SessionMaster.HeartBeat(2)

每次接收到新的消息的时候就更新接收时间

//更新接收时间
sess.UpdateTime()

以上是核心代码。细节可以看 microSocket

相关文章

  • go语言socket框架之心跳处理

    前言: 本次我们来讲解怎么在自己的框架里面增加心跳处理。已经把所有代码整合了,希望给个星星支持一下 microSo...

  • golang TCP Socket的一篇好文章

    Go语言TCP Socket编程

  • 第14章-并发性Concurrency

    并发性Concurrency 1.1 什么是并发 Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之...

  • Golang(十四) 并发性Concurrency

    并发性Concurrency 1.1 什么是并发 Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之...

  • golang内存逃逸

    一篇很好的博客: Go 语言机制之栈与指针 Go 语言机制之逃逸分析 Go 语言机制之内存剖析 Go 语言机制之数...

  • 初窥Go轻量级框架beego

    ****前言****初窥Go轻量级框架beego 基于Go语言的轻量级Web框架 国人开发的优秀框架 稳定可靠、社...

  • Go web 开发框架 Iris

    背景 掌握了 Go 语言的基础后就该开始实践了,编写Web应用首先需要一个 web 开发框架。做框架选型时,处理w...

  • Go Gin 框架简单实现

    Go 版本:go version go1.18.2 darwin/amd64 Go 语言 Gin 框架主要包含七个...

  • 拆轮子系列:gin框架

    关于WEB框架 由于现在编程的语言变成go了,所以拆轮子系列,拆的轮子也是go方面的了,其实也不要紧,因为处理的思...

  • go语言框架

    6 款最棒的 Go 语言 Web 框架简介[https://studygolang.com/articles/11...

网友评论

      本文标题:go语言socket框架之心跳处理

      本文链接:https://www.haomeiwen.com/subject/xeatoftx.html