真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

基于Etcd和Raft的協(xié)調(diào)服務(wù)如何進(jìn)行Golang實(shí)現(xiàn)

本篇文章為大家展示了基于Etcd和Raft的協(xié)調(diào)服務(wù)如何進(jìn)行Golang實(shí)現(xiàn),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)主營(yíng)番禺網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,番禺h5微信小程序搭建,番禺網(wǎng)站營(yíng)銷推廣歡迎番禺等地區(qū)企業(yè)咨詢

我們利用Etcd作為中間件開發(fā)出特定的基于Raft協(xié)議算法的應(yīng)用,Raft協(xié)議本身是一種leader-based的共識(shí)算法,常用于分布式系統(tǒng)(選舉成一個(gè)Master,多個(gè)worker)的情景,來解決內(nèi)容一致性問題的同時(shí),也使得集群具備一定的容錯(cuò)能力。
另外提一下Consul 也是基于Raft協(xié)議的算法實(shí)現(xiàn)。
本文中使用了Golang的語言實(shí)現(xiàn),但原理都一樣其他語言實(shí)現(xiàn)是一樣的。

基于Etcd和Raft的協(xié)調(diào)服務(wù)如何進(jìn)行Golang實(shí)現(xiàn)

package main
import (    "go.etcd.io/etcd/clientv3"    "time"    "fmt"    "context")
func main() {    var (        config clientv3.Config        client *clientv3.Client        err error        lease clientv3.Lease        leaseGrantResp *clientv3.LeaseGrantResponse        leaseId clientv3.LeaseID        keepRespChan <-chan *clientv3.LeaseKeepAliveResponse        keepResp *clientv3.LeaseKeepAliveResponse        ctx context.Context        cancelFunc context.CancelFunc        kv clientv3.KV        txn clientv3.Txn        txnResp *clientv3.TxnResponse    )
   // 客戶端配置    config = clientv3.Config{        Endpoints: []string{"0.0.0.0:2379"},        DialTimeout: 5 * time.Second,    }
   // 建立連接    if client, err = clientv3.New(config); err != nil {        fmt.Println(err)        return    }
   // lease實(shí)現(xiàn)鎖自動(dòng)過期(上鎖之后,如果節(jié)點(diǎn)宕機(jī),鎖會(huì)一直占用,所以要過期機(jī)制,也要續(xù)租機(jī)制):    // op操作    // txn事務(wù): if else then
   // 1, 上鎖 (創(chuàng)建租約, 自動(dòng)續(xù)租, 拿著租約去搶占一個(gè)key)    lease = clientv3.NewLease(client)
   // 申請(qǐng)一個(gè)5秒的租約    if leaseGrantResp, err = lease.Grant(context.TODO(), 5); err != nil {        fmt.Println(err)        return    }
   // 拿到租約的ID    leaseId = leaseGrantResp.ID
   // 準(zhǔn)備一個(gè)用于取消自動(dòng)續(xù)租的context    ctx, cancelFunc = context.WithCancel(context.TODO())
   // 確保函數(shù)退出后, 自動(dòng)續(xù)租會(huì)停止    defer cancelFunc() //終止自動(dòng)續(xù)租協(xié)程(goroutine)    defer lease.Revoke(context.TODO(), leaseId) //告訴etcd把租約直接釋放掉,更直接,立即刪除,鎖就釋放了
   // 5秒后會(huì)取消自動(dòng)續(xù)租    if keepRespChan, err = lease.KeepAlive(ctx, leaseId); err != nil {        fmt.Println(err)        return    }
   // 處理續(xù)約應(yīng)答的協(xié)程    go func() {        for {            select {            case keepResp = <- keepRespChan:                if keepRespChan == nil {                    fmt.Println("租約已經(jīng)失效了")                    goto END                } else {    // 每秒會(huì)續(xù)租一次, 所以就會(huì)受到一次應(yīng)答                    fmt.Println("收到自動(dòng)續(xù)租應(yīng)答:", keepResp.ID)                }            }        }    END:    }()
   //  if 不存在key, then 設(shè)置它, else 搶鎖失敗    kv = clientv3.NewKV(client)
   // 創(chuàng)建事務(wù)    txn = kv.Txn(context.TODO())
   // 定義事務(wù)
   // 如果key不存在(創(chuàng)建版本是0說明沒有被創(chuàng)建)    txn.If(clientv3.Compare(clientv3.CreateRevision("/cron/lock/job9"), "=", 0)).        Then(clientv3.OpPut("/cron/lock/job9", "xxx", clientv3.WithLease(leaseId))).        Else(clientv3.OpGet("/cron/lock/job9")) // 否則搶鎖失敗
   // 提交事務(wù)    if txnResp, err = txn.Commit(); err != nil {        fmt.Println(err)        return // 沒有問題    }
   // 判斷是否搶到了鎖    if !txnResp.Succeeded {        fmt.Println("鎖被占用:", string(txnResp.Responses[0].GetResponseRange().Kvs[0].Value))        return    }
   // 2, 處理業(yè)務(wù)
   fmt.Println("處理任務(wù)")    time.Sleep(5 * time.Second)
   // 3, 釋放鎖(取消自動(dòng)續(xù)租, 釋放租約)    // 上面的defer 會(huì)把租約釋放掉, 關(guān)聯(lián)的KV就被刪除了}

上述內(nèi)容就是基于Etcd和Raft的協(xié)調(diào)服務(wù)如何進(jìn)行Golang實(shí)現(xiàn),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享標(biāo)題:基于Etcd和Raft的協(xié)調(diào)服務(wù)如何進(jìn)行Golang實(shí)現(xiàn)
文章網(wǎng)址:http://weahome.cn/article/pdsosi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部