<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Raft協(xié)議示意-Golang版本

      說明:受b站某視頻中l(wèi)iwenzhou講解啟發(fā),但懶得看別人的實現(xiàn),就自己搞一個

       

        1 package main
        2 
        3 import (
        4     "fmt"
        5     "math/rand"
        6     "sync"
        7     "time"
        8 )
        9 
       10 func main() {
       11     wg := sync.WaitGroup{}
       12     wg.Add(1)
       13 
       14     //啟動Leader
       15     L.Start()
       16 
       17     //新建節(jié)點
       18     now := time.Now()
       19     for i := 0; i < 3; i++ {
       20         M[i] = &Node{ID: i, Role: 0, HB: make(chan *HeartBeatMsg, 16), VoteFor: -1, ChangeAt: now}
       21     }
       22     //啟動所有節(jié)點
       23     for _, v := range M {
       24         v.Start()
       25     }
       26 
       27     wg.Wait()
       28 }
       29 
       30 // Leader
       31 var L = &Leader{Node: nil, Term: -1, At: time.Now()}
       32 
       33 // 所有節(jié)點
       34 var M = map[int]*Node{}
       35 
       36 // 心跳內(nèi)容
       37 const (
       38     ASK  = "ASK"
       39     OK   = "OK"
       40     NO   = "NO"
       41     PING = "PING"
       42     PONG = "PONG"
       43 )
       44 
       45 // 心跳間隔
       46 const HeartBeatInterval = time.Second * 2
       47 
       48 // Leader 領(lǐng)導(dǎo)者
       49 type Leader struct {
       50     Node *Node     //領(lǐng)導(dǎo)者節(jié)點
       51     Term int       //任期
       52     At   time.Time //任期開始時間
       53 }
       54 
       55 // Raft節(jié)點
       56 type Node struct {
       57     ID        int
       58     Role      int                //角色:0跟隨者、1候選者、2領(lǐng)導(dǎo)者
       59     HB        chan *HeartBeatMsg //收到的心跳
       60     VoteFor   int                //站誰
       61     ChangeAt  time.Time          //角色變更時間
       62     VoteCount int                //收到的選票數(shù)量
       63     VetoCount int                //收到的拒絕票數(shù)量
       64     LastAt    time.Time          //上次收到消息的時間
       65 }
       66 
       67 // 心跳報文
       68 type HeartBeatMsg struct {
       69     From int       //發(fā)送方ID
       70     At   time.Time //發(fā)送時間
       71     Data string    //發(fā)送內(nèi)容
       72 }
       73 
       74 // Leader的啟動方法
       75 func (l *Leader) Start() {
       76     go func() {
       77         for {
       78             //領(lǐng)導(dǎo)沒事就PING
       79             if l.Node == nil || M == nil || len(M) == 0 {
       80                 <-time.After(time.Second)
       81                 continue
       82             }
       83 
       84             now := time.Now()
       85             for _, n := range M {
       86                 if l.Node == n {
       87                     continue
       88                 }
       89                 fmt.Printf("leader%d send PING\n", l.Node.ID)
       90                 n.HB <- &HeartBeatMsg{From: l.Node.ID, At: now, Data: PING}
       91             }
       92             //每隔1秒PING一次
       93             <-time.After(HeartBeatInterval / 2) //FIXME 不能interval-1啊啊啊
       94 
       95         }
       96     }()
       97 }
       98 
       99 // Node的啟動方法
      100 func (n *Node) Start() {
      101     go func() {
      102         for {
      103             //
      104             select {
      105             case <-time.After(HeartBeatInterval):
      106                 fmt.Printf("Node%d got no msg in past 2 seconds\n", n.ID)
      107                 //run for leader
      108                 if L.Node == nil && n.VoteFor == -1 && n.Role == 0 {
      109                     n.Role = 1
      110                     n.VoteFor = n.ID
      111                     n.VoteCount = 1
      112                     d := rand.Intn(150) + 150
      113                     <-time.After(time.Millisecond * time.Duration(d))
      114                     n.ChangeAt = time.Now()
      115                     n.sendHeartBeat(ASK, n.ChangeAt)
      116                 }
      117 
      118             case hb := <-n.HB:
      119                 fmt.Printf("hb %d @ %d\n", hb.From, n.ID)
      120                 n.LastAt = hb.At //這個時間,是否有必要都更新?響應(yīng)的
      121                 n.handleHeartBeat(hb)
      122 
      123             }
      124 
      125         }
      126     }()
      127 }
      128 
      129 // Node發(fā)送心跳
      130 func (n *Node) sendHeartBeat(data string, at time.Time) {
      131     hb := &HeartBeatMsg{From: n.ID, At: at, Data: data}
      132     for _, v := range M {
      133         if v.ID == n.ID {
      134             continue
      135         }
      136         v.HB <- hb
      137     }
      138 }
      139 
      140 // Node處理心跳
      141 func (n *Node) handleHeartBeat(hb *HeartBeatMsg) {
      142 
      143     switch hb.Data {
      144     case ASK:
      145         if L.Node != nil {
      146             fmt.Println("有領(lǐng)導(dǎo),拒絕")
      147             M[hb.From].HB <- &HeartBeatMsg{From: n.ID, Data: NO}
      148         }
      149         if n.Role == 0 {
      150             if n.VoteFor == -1 {
      151                 fmt.Printf("%d同意%d\n", n.ID, hb.From)
      152                 n.VoteFor = hb.From
      153                 M[hb.From].HB <- &HeartBeatMsg{From: n.ID, Data: OK}
      154             } else {
      155                 fmt.Printf("%d已同意別人,拒絕%d\n", n.ID, hb.From)
      156                 M[hb.From].HB <- &HeartBeatMsg{From: n.ID, Data: NO}
      157             }
      158         } //是不是要判斷下候選者的時間,以決定是否同意?
      159         if n.Role == 1 {
      160             if n.ChangeAt.After(hb.At) {
      161                 fmt.Printf("%d同意%d,并將自身變回跟隨者\n", n.ID, hb.From)
      162                 n.VoteFor = hb.From
      163                 n.Role = 0
      164                 M[hb.From].HB <- &HeartBeatMsg{From: n.ID, Data: OK}
      165             } else {
      166                 fmt.Printf("%d不同意%d,%d更早\n", n.ID, hb.From, n.ID)
      167                 M[hb.From].HB <- &HeartBeatMsg{From: n.ID, Data: NO}
      168             }
      169         }
      170     case OK:
      171         n.VoteCount++
      172     case NO:
      173         n.VetoCount++
      174     case PING:
      175         M[hb.From].HB <- &HeartBeatMsg{From: n.ID, Data: PONG}
      176     case PONG:
      177     }
      178     // 其實當(dāng)選后,應(yīng)該清理所有的狀態(tài)
      179     if n.Role != 1 {
      180         return
      181     }
      182     //判斷是否當(dāng)選,或者是否失敗
      183     if n.VetoCount+n.VoteCount == len(M) {
      184         now := time.Now()
      185         if n.VoteCount > len(M)/2 {
      186             n.Role = 2
      187             n.ChangeAt = now
      188             n.VoteFor = -1
      189             n.VetoCount = 0
      190             n.VoteCount = 0
      191             L.Node = n
      192             L.Term++
      193             L.At = now
      194 
      195             fmt.Println("!!!LEADER", L.Node.ID)
      196         } else {
      197             n.Role = 0
      198             n.ChangeAt = now
      199             n.VoteFor = -1
      200             n.VetoCount = 0
      201             n.VoteCount = 0
      202         }
      203     }
      204 }

       

      運行:

      [Running] go run "c:\Users\Administrator\GoProjects\bilibili\raft\main.go"
      Node2 got no msg in past 2 seconds
      Node0 got no msg in past 2 seconds
      Node1 got no msg in past 2 seconds
      hb 1 @ 0
      hb 0 @ 1
      1不同意0,1更早
      0同意1,并將自身變回跟隨者
      hb 1 @ 0
      hb 0 @ 1
      hb 1 @ 2
      2同意1,并將自身變回跟隨者
      hb 2 @ 0
      0已同意別人,拒絕2
      hb 0 @ 2
      2已同意別人,拒絕0
      hb 2 @ 1
      1不同意2,1更早
      hb 2 @ 1
      !!!LEADER 1
      hb 2 @ 0
      hb 0 @ 2
      hb 1 @ 2
      leader1 send PING
      leader1 send PING
      hb 1 @ 2
      hb 2 @ 1
      hb 1 @ 0
      hb 0 @ 1
      leader1 send PING
      leader1 send PING
      hb 1 @ 2
      hb 2 @ 1
      hb 1 @ 0
      hb 0 @ 1

       

      posted on 2022-09-27 20:23  LarryZeal  閱讀(132)  評論(0)    收藏  舉報

      導(dǎo)航

      主站蜘蛛池模板: 亚洲国产一区二区三区亚瑟| 日本道不卡一二三区视频| 国产成人8x视频一区二区| 国产中文字幕在线一区| 黑巨人与欧美精品一区| 综合偷自拍亚洲乱中文字幕| 夜色福利站WWW国产在线视频 | 91精品人妻中文字幕色| 狠狠综合久久av一区二| 欧洲人与动牲交α欧美精品| 超碰成人人人做人人爽| 无码专区 人妻系列 在线| 亚洲综合在线日韩av| 久久精品无码一区二区三区| 毛片av在线尤物一区二区| 亚洲+成人+国产| 亚洲欧美人成网站在线观看看| 国产馆在线精品极品粉嫩| 色噜噜一区二区三区| 开心一区二区三区激情| 国精品午夜福利视频不卡| 一本av高清一区二区三区| 中国亚洲女人69内射少妇| 国产无套精品一区二区| 国产成人片无码视频在线观看| 中文字幕永久精品国产| 久久久av波多野一区二区| 免费无码高H视频在线观看| 成人午夜看黄在线尤物成人| 又大又紧又粉嫩18p少妇| 国产日产精品系列| 中文人妻av高清一区二区| 亚洲高请码在线精品av| 亚洲美免无码中文字幕在线| 男女爽爽无遮挡午夜视频| 国产精品女视频一区二区| 中文无码妇乱子伦视频| 欧美视频精品免费覌看| 白嫩人妻精品一二三四区| 久久精品国产亚洲AV麻| 深夜福利资源在线观看|