go语言心跳超时的实现示例_第1页
go语言心跳超时的实现示例_第2页
go语言心跳超时的实现示例_第3页
go语言心跳超时的实现示例_第4页
go语言心跳超时的实现示例_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第go语言心跳超时的实现示例目录一、背景二、心跳超时的实现2.1通过selectcase(设计概念比较多)2.2通过time.sleep(简单有效)三、个人的实现观感

一、背景

本文描述的是客户端接收心跳信息的超时实现。心跳超时,或者接受信息超过限定时间在分布式系统中出现的次数比较多。常见的就有hadoop中节点超时,或者日志中出现timeout的字样。

在学习go语言中,我也根据go语言的机制实现了心跳超时的这个问题。踩过坑,趟过水。

二、心跳超时的实现

2.1通过selectcase(设计概念比较多)

这种方法实现心跳,需要对go语言中的channel和selectcase机制有所了解。select代码段中没有包含default条件时,会一直阻塞到有通道操作。

需要注意的是!!!!select语言只会阻塞一次,且执行一次。如果需要多次判断,或者可能有多个case条件需要满足,那就需要增加for语句。

首先需要知道的是select是专为channel设计的,所以说每个case表达式都必须是包含操作通道的表达式。下面这段代码是描述了随机抽取一个channel发消息,正常情况下,不会触发超时。为了触发超时,注释掉通道发送数据操作。超时五秒,则触发超时。

packagemain

import(

"fmt"

"math/rand"

"time"

funcmain(){

//准备好三个通道。

intChannels:=[3]chanint{

make(chanint,1),

make(chanint,1),

make(chanint,1),

//随机选择一个通道,并向它发送元素值。

index:=rand.Intn(3)

fmt.Printf("Theindex:%d\n",index)

//‼️取消这行代码的注视,超时条件的选择就会触发。

//intChannels[index]-index

//哪一个通道中有可取的元素值,哪个对应的分支就会被执行。

select{

case-intChannels[0]:

fmt.Println("Thefirstcandidatecaseisselected.")

case-intChannels[1]:

fmt.Println("Thesecondcandidatecaseisselected.")

caseelem:=-intChannels[2]:

fmt.Printf("Thethirdcandidatecaseisselected,theelementis%d.\n",elem)

case-time.After(5*time.Second):

fmt.Println("timedout")

2.2通过time.sleep(简单有效)

通过time.sleep()实现超时操作,是比较巧妙的。一般来说心跳超时是一个双方交互的行为。

下面画一个图来描述一下。

为了方便理解,定义双方都使用共同时间。

下面是代码。

基本的逻辑是:

1、先给客户端设置一个下次超时的时间

2、客户端每次收到心跳的时候,更新这个时间

3、开启一个独立的线程,一致判断当前客户端是否超时。

ps:结合时效和性能,可以间隔一定的时间来进行判断。

packagemain

import(

"fmt"

"sync"

"time"

typeClientstruct{

locksync.Mutex//加锁

nextTimeOutTimetime.Time//下次超时时间

consttenSec=10

刷新每次的心跳超时机制

func(client*Client)freshTimeOutTime(){

client.lock.Lock()

deferclient.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)

iftime.Now().After(client.nextTimeOutTime){

fmt.Printf("%v超时了\n",client.nextTimeOutTime)

//客户端收到以后,修改下次心跳超时时间

func(client*Client)receiveHeart(){

client.freshTimeOutTime()

//开启一个模拟ping客户端的线程

funcpingClient(client*Client){

fortrue{

time.Sleep(11*time.Second)

fmt.Printf("%v请求发送时间\n",time.Now())

client.receiveHeart()

funcmain(){

cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论