go语言心跳超时怎么实现
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍了go语言心跳超时怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言心跳超时怎么实现文章都会有所收获,下面我们一起来看看吧。一、背景本文描述的
千家信息网最后更新 2025年01月19日go语言心跳超时怎么实现
这篇文章主要介绍了go语言心跳超时怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言心跳超时怎么实现文章都会有所收获,下面我们一起来看看吧。
一、背景
本文描述的是客户端接收心跳信息的超时实现。心跳超时,或者接受信息超过限定时间在分布式系统中出现的次数比较多。常见的就有hadoop中节点超时,或者日志中出现timeout的字样。
二、心跳超时的实现
2.1 通过select case (设计概念比较多)
这种方法实现心跳,需要对go语言中的channel和select case 机制有所了解。select代码段中没有包含default条件时,会一直阻塞到有通道操作。
需要注意的是!!!! select语言只会阻塞一次,且执行一次。如果需要多次判断,或者可能有多个case条件需要满足,那就需要增加for语句。
首先需要知道的是select是专为channel设计的,所以说每个case表达式都必须是包含操作通道的表达式。下面这段代码是描述了随机抽取一个channel发消息,正常情况下,不会触发超时。为了触发超时,注释掉通道发送数据操作。超时五秒,则触发超时。
package main import ( "fmt" "math/rand" "time") func main() { // 准备好三个通道。 intChannels := [3]chan int{ make(chan int, 1), make(chan int, 1), make(chan int, 1), } // 随机选择一个通道,并向它发送元素值。 index := rand.Intn(3) fmt.Printf("The index: %d\n", index) //‼️ 取消这行代码的注视,超时条件的选择就会触发。 //intChannels[index] <- index // 哪一个通道中有可取的元素值,哪个对应的分支就会被执行。 select { case <-intChannels[0]: fmt.Println("The first candidate case is selected.") case <-intChannels[1]: fmt.Println("The second candidate case is selected.") case elem := <-intChannels[2]: fmt.Printf("The third candidate case is selected, the element is %d.\n", elem) case <-time.After(5 * time.Second): fmt.Println("timed out") }}
2.2 通过time.sleep(简单有效)
通过time.sleep()实现超时操作,是比较巧妙的。一般来说心跳超时是一个双方交互的行为。
下面画一个图来描述一下。
为了方便理解,定义双方都使用共同时间。
下面是代码。
基本的逻辑是:
1、先给客户端设置一个下次超时的时间
2、客户端每次收到心跳的时候,更新这个时间
3、开启一个独立的线程,一致判断当前客户端是否超时。
ps:结合时效和性能,可以间隔一定的时间来进行判断。
package main import ( "fmt" "sync" "time") type Client struct { lock sync.Mutex //加锁 nextTimeOutTime time.Time //下次超时时间} const tenSec = 10/**刷新每次的心跳超时机制 */func (client *Client) freshTimeOutTime() { client.lock.Lock() defer client.lock.Unlock() client.nextTimeOutTime =time.Now().Add(tenSec*time.Second)} //开启一个gp,每隔500ms判断有没有超时func (client *Client) judgeTimeOut() { for { time.Sleep(500*time.Millisecond) fmt.Printf("%v 在判断是否超时\n", client.nextTimeOutTime) if time.Now().After(client.nextTimeOutTime) { fmt.Printf("%v 超时了\n", client.nextTimeOutTime) } }} //客户端收到以后,修改下次心跳超时时间func (client *Client) receiveHeart() { client.freshTimeOutTime()} //开启一个模拟ping 客户端的线程func pingClient(client *Client) { for true { time.Sleep(11*time.Second) fmt.Printf("%v 请求发送时间\n", time.Now()) client.receiveHeart() } } func main() { client := Client{ lock: sync.Mutex{}, nextTimeOutTime: time.Time{}, } //在当前时刻,更新下次的超时时刻是10s中后 client.freshTimeOutTime() go pingClient(&client) go client.judgeTimeOut() for true { }}
关于"go语言心跳超时怎么实现"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"go语言心跳超时怎么实现"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
时间
语言
客户
通道
客户端
代码
条件
知识
信息
元素
内容
双方
时刻
机制
篇文章
线程
表达式
更新
设计
选择
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
疫情网络安全员坚守岗位
50多台服务器远距离传输
山东靠谱的软件开发公司
明日方舟那个服务器人多
服务器巡检规范
网络安全产品展板装饰
网络安全易购
晨星公司软件开发怎么样
软件开发中的某些观点辨析
山东办公系统软件开发服务费
服务器炸了怎么办
网络安全精美手抄报内容
网络安全与意识形态主题班会
苏州工业软件开发哪家专业
服务器平台升级改造
网络安全宣传干部
腾讯服务器和域名如何建站
西安网络安全周主题
虎豹骑登录服务器
火山软件开发平台配置
手机服务器错误处理
为什么数据库需要连接
护苗网络安全课第三课
上海上门软件开发定制价钱
肿瘤数据库大全
数据库的封锁技术
任天堂账号与服务器连接断开
阿里巴巴运营服务器
清远无线软件开发费用是多少
试述防火墙在网络安全中的作用