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安全错误
数据库的锁怎样保障安全
网络安全管理重要
一个服务器可以挂两个路由器吗
网络安全搞笑图画
防网络安全手抄报一等奖
华为48t服务器
西安曲江新区愚控网络技术部
移动液冷服务器推荐
我看网络安全的手抄报
数据库超时时间
罗湖区网络技术进出口
高校密码泄露网络安全事件
网易做服务器需要注意的地方
网络安全自我防范的演讲稿
智慧团建公众号服务器异常
广铁集团网络安全工作实行
银行服务器管理程序界面
物业 资产管理数据库
国家关于网络安全的部门
泰安app定制软件开发解决方案
京隆科技软件开发师
软件开发框架说明书
c 定时播放数据库文件
服务器数据只能进不能出
把数据库软件重下载了结果打不开
网络安全的法律的全称是
vfp 关闭数据库
录像机和服务器不在一地映射
网络安全运维实习小结
mysql数据库两张表去重
河南火鸡哥网络技术