go语言心跳超时怎么实现
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍了go语言心跳超时怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言心跳超时怎么实现文章都会有所收获,下面我们一起来看看吧。一、背景本文描述的
千家信息网最后更新 2024年11月22日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安全错误
数据库的锁怎样保障安全
嘀嗒网络安全
软件开发evg代表什么
ibm服务器管理口默认密码
软件开发dr是啥意思
目前广泛应用的汽车网络技术
河北正规网络技术服务创新服务
职教云服务器连接失败
中国电信代理服务器
锐龙和酷睿哪个适合软件开发
华为服务器告警灯H05
科大讯飞软件开发工程师实习
数据库超市管理系统绪论
怎么清楚苹果手机微信数据库
数据库建立索引的主要作用
新起点软件开发
联想新服务器如何安装raid卡
DMDW网络技术
中小学网络安全新闻
网络技术挑战赛总决赛有奖金吗
二年级网络安全手抄报图片
计算机数字媒体和网络技术哪个好
软件开发实名认证
手机软件开发工作好吗
云南项目软件开发排行
物联网网络安全全球化
科技和互联网下的银行
边锋网络技术有限公司上海
现代通信网络技术6
云之天地服务器
兔子ip的服务器