溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用rust版本的peerstore

發(fā)布時(shí)間:2021-10-19 09:54:29 來源:億速云 閱讀:129 作者:iii 欄目:編程語言

這篇文章主要介紹“如何使用rust版本的peerstore”,在日常操作中,相信很多人在如何使用rust版本的peerstore問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用rust版本的peerstore”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

實(shí)現(xiàn)構(gòu)想

首先,由于我們的啟動(dòng)核心是swarm,那peerstore會(huì)作為其中的一個(gè)屬性。其次,在go-libp2p-peerstore中,peerstore主要存放的數(shù)據(jù)為三塊:地址信息的AddrBook,公私鑰信息的KeyBook,協(xié)議信息的ProtoBook;我們可以將三者結(jié)合在一起組成一個(gè)新的struct,取名為PeerRecord,放在以peer_id為key的Hashmap中。

垃圾回收機(jī)制

GC存在的意義就是防止hashmap過度膨脹。由于網(wǎng)絡(luò)狀態(tài)時(shí)時(shí)刻刻都在發(fā)生變化,peer之間的連接也可能隨之變化,而peerstore有一個(gè)重要的作用就是存放peer的地址信息。如果不對已經(jīng)失效的peer信息進(jìn)行清理,就會(huì)影響到peerstore的工作效率。

目前實(shí)現(xiàn)的效果是,在swarm的start方法中使用task::spawn啟動(dòng)一個(gè)任務(wù),創(chuàng)建一個(gè)mpsc的channel,使用select語法等待管道傳來的消息或者 task 等待10分鐘的邏輯完成,針對某些地址,如果已經(jīng)超出ttl的限制,清理當(dāng)前地址;同時(shí),如果當(dāng)前peer_id的地址集合中不存在任何的地址信息,就將其從Hashmap中移除。

Pinned

雖然GC機(jī)制的存在,使Hashmap不會(huì)無限制擴(kuò)容,良好地幫助了系統(tǒng)的運(yùn)行。但是仍然有些不足的地方,考慮如下這種情況:

對于KAD協(xié)議來說,peer需要不停地進(jìn)行迭代查詢已知節(jié)點(diǎn),逐步填充自己的KBucket,這是一個(gè)耗時(shí)的過程。如果在gc時(shí),將較早查詢到的節(jié)點(diǎn)地址信息從peerstore中移除了,那么又需要重新啟用迭代查詢?nèi)カ@取地址,因此我們在PeerRecord中添加了一個(gè)bool值pinned。GC時(shí)會(huì)判斷這條記錄的類別,如果pinned為true,就會(huì)跳過清理的步驟。

序列化與持久化

對每一個(gè)peer來說,因?yàn)槟承┰蛐枰戮€或停機(jī)時(shí),存放在peerstore里的節(jié)點(diǎn)信息是不應(yīng)該被丟棄的。而對于需要持久化的數(shù)據(jù),也需要進(jìn)行序列化操作,便于存放。

在libp2p-rs中,主循環(huán)的調(diào)用也是通過task::spawn啟動(dòng)的。當(dāng)swarm接收到close的消息時(shí),將會(huì)退出事件處理的循環(huán),并向運(yùn)行peerstore的gc線程發(fā)送一個(gè)close()的事件,結(jié)束gc的過程。接下來調(diào)用peerstore的save_data()方法,將數(shù)據(jù)使用serde序列化成json格式,并使用std::io將序列化后的數(shù)據(jù)存放到根目錄的txt文件中。

方法分析

以GC方法進(jìn)行解析:

  1. swarm主循環(huán)spawn運(yùn)行task,每十分鐘觸發(fā)一次select。

  2. Hashmap被Arc<Mutex>包裹,可以通過lock()獲取,保證并發(fā)安全。

  3. 如果該peer的信息不是通過kad獲取的,調(diào)用retain篩選未超出ttl時(shí)限的地址。

  4. 如果當(dāng)前peer的地址數(shù)據(jù)已經(jīng)清空,從hashmap中移除這個(gè)peer。

    // swarm/lib.rs
    // The GC task is to remove all expired addresses from the peer store
        task::spawn(async move {
            log::info!("starting Peerstore GC...");
            loop {
                let either = future::select(rx.next(), task::sleep(PEERSTORE_GC_PURGE_INTERVAL).boxed()).await;
                match either {
                    Either::Left((_, _)) => break,
                    Either::Right((_, _)) => peer_store.remove_expired_addrs(),
                }
            }
            log::info!("quitting Peerstore GC...");
        });
        
    // core/peerstore.rs
    /// Removes all expired address.
    pub fn remove_expired_addrs(&self) {
        let mut to_remove = vec![];
        let mut guard = self.inner.lock().unwrap();
        for (peer, pr) in guard.iter_mut() {
            if !pr.pinned {
                log::debug!("GC attempt for {:?}", peer);
                pr.addrs.retain(|record| record.expiry.elapsed() < record.ttl);
                // delete this peer if no addr at all
                if pr.addrs.is_empty() {
                    log::debug!("remove {:?} from peerstore", peer);
                    to_remove.push(peer.clone());
                }
            }
        }

        for peer in to_remove {
            guard.remove(&peer);
        }
    }

Netwarps 由國內(nèi)資深的云計(jì)算和分布式技術(shù)開發(fā)團(tuán)隊(duì)組成,該團(tuán)隊(duì)在金融、電力、通信及互聯(lián)網(wǎng)行業(yè)有非常豐富的落地經(jīng)驗(yàn)。Netwarps 目前在深圳、北京均設(shè)立了研發(fā)中心,團(tuán)隊(duì)規(guī)模30+,其中大部分為具備十年以上開發(fā)經(jīng)驗(yàn)的技術(shù)人員,分別來自互聯(lián)網(wǎng)、金融、云計(jì)算、區(qū)塊鏈以及科研機(jī)構(gòu)等專業(yè)領(lǐng)域。 Netwarps 專注于安全存儲(chǔ)技術(shù)產(chǎn)品的研發(fā)與應(yīng)用,主要產(chǎn)品有去中心化文件系統(tǒng)(DFS)、去中心化計(jì)算平臺(tái)(DCP),致力于提供基于去中心化網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn)的分布式存儲(chǔ)和分布式計(jì)算平臺(tái),具有高可用、低功耗和低網(wǎng)絡(luò)的技術(shù)特點(diǎn),適用于物聯(lián)網(wǎng)、工業(yè)互聯(lián)網(wǎng)等場景。 

到此,關(guān)于“如何使用rust版本的peerstore”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI