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

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

鴻蒙rust開發(fā),csdn 鴻蒙

rust可以開發(fā)分布式系統(tǒng)嗎

rust是可以開發(fā)分布式系統(tǒng)的。

成都創(chuàng)新互聯(lián)服務(wù)項目包括順慶網(wǎng)站建設(shè)、順慶網(wǎng)站制作、順慶網(wǎng)頁制作以及順慶網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,順慶網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到順慶省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

引子

構(gòu)建一個分布式系統(tǒng) 并不是一件容易的事情,我們需要考慮很多的問題,首先就是我們的系統(tǒng)到底需要提供什么樣的功能,譬如:

一致性:我們是否需要保證整個系統(tǒng)的線性一致性,還是能容忍短時間的數(shù)據(jù)不一致,只支持最終一致性。

穩(wěn)定性:我們能否保證系統(tǒng) 7 x 24 小時穩(wěn)定運(yùn)行。系統(tǒng)的可用性是 4 個 9,還有 5 個 9?如果出現(xiàn)了機(jī)器損壞等災(zāi)難情況,系統(tǒng)能否做的自動恢復(fù)。

擴(kuò)展性:當(dāng)數(shù)據(jù)持續(xù)增多,能否通過添加機(jī)器就自動做到數(shù)據(jù)再次平衡,并且不影響外部服務(wù)。

分布式事務(wù):是否需要提供分布式事務(wù)支持,事務(wù)隔離等級需要支持到什么程度。

上面的問題在系統(tǒng)設(shè)計之初,就需要考慮好,作為整個系統(tǒng)的設(shè)計目標(biāo)。為了實現(xiàn)這些特性,我們就需要考慮到底采用哪一種實現(xiàn)方案,取舍各個方面的利弊等。

后面,我將以我們開發(fā)的分布式 Key-Value TiKV 作為實際例子,來說明下我們是如何取舍并實現(xiàn)的。

TiKV

TiKV 是一個分布式 Key-Value store,它使用 Rust 開發(fā),采用 Raft 一致性協(xié)議保證數(shù)據(jù)的強(qiáng)一致性,以及穩(wěn)定性,同時通過 Raft 的 Configuration Change 機(jī)制實現(xiàn)了系統(tǒng)的可擴(kuò)展性。

TiKV 提供了基本的 KV API 支持,也就是通常的 Get,Set,Delete,Scan 這樣的 API。TiKV 也提供了支持 ACID 事務(wù)的 Transaction API,我們可以使用 Begin 開啟一個事務(wù),在事務(wù)里面對 Key 進(jìn)行操作,最后再用 Commit 提交一個事務(wù),TiKV 支持 SI 以及 SSI 事務(wù)隔離級別,用來滿足用戶的不同業(yè)務(wù)場景。

Rust

在規(guī)劃好 TiKV 的特性之后,我們就要開始進(jìn)行 TiKV 的開發(fā)。這時候,我們面臨的第一個問題就是采用什么樣的語言進(jìn)行開發(fā)。當(dāng)時,擺在我們眼前的有幾個選擇:

Go,Go 是我們團(tuán)隊最擅長的一門語言,而且 Go 提供的 goroutine,channel 這些機(jī)制,天生的適合大規(guī)模分布式系統(tǒng)的開發(fā),但靈活方便的同時也有一些甜蜜的負(fù)擔(dān),首先就是 GC,雖然現(xiàn)在 Go 的 GC 越來越完善,但總歸會有短暫的卡頓,另外 goroutine 的調(diào)度也會有切換開銷,這些都可能會造成請求的延遲增高。

Java,現(xiàn)在世面上面有太多基于 Java 做的分布式系統(tǒng)了,但 Java 一樣有 GC 等開銷問題,同時我們團(tuán)隊在 Java 上面沒有任何開發(fā)經(jīng)驗,所以沒有采用。

C++,C++ 可以認(rèn)為是開發(fā)高性能系統(tǒng)的代名詞,但我們團(tuán)隊沒有特別多的同學(xué)能熟練掌握 C++,所以開發(fā)大型 C++ 項目并不是一件非常容易的事情。雖然使用現(xiàn)代 C++ 的編程方式能大量減少 data race,dangling pointer 等風(fēng)險,我們?nèi)匀豢赡芊稿e。

當(dāng)我們排除了上面幾種主流語言之后,我們發(fā)現(xiàn),為了開發(fā) TiKV,我們需要這門語言具有如下特性:

靜態(tài)語言,這樣才能最大限度的保證運(yùn)行性能。

無 GC,完全手動控制內(nèi)存。

Memory safe,盡量避免 dangling pointer,memory leak 等問題。

Thread safe,不會遇到 data race 等問題。

包管理,我們可以非常方便的使用第三方庫。

高效的 C 綁定,因為我們還可能使用一些 C library,所以跟 C 交互不能有開銷。

綜上,我們決定使用 Rust,Rust 是一門系統(tǒng)編程語言,它提供了我們上面想要的語言特性,但選擇 Rust 對我們來說也是很有風(fēng)險的,主要有兩點(diǎn):

我們團(tuán)隊沒有任何 Rust 開發(fā)經(jīng)驗,全部都需要花時間學(xué)習(xí) Rust,而偏偏 Rust 有一個非常陡峭的學(xué)習(xí)曲線。

基礎(chǔ)網(wǎng)絡(luò)庫的缺失,雖然那個時候 Rust 已經(jīng)出了 1.0,但我們發(fā)現(xiàn)很多基礎(chǔ)庫都沒有,譬如在網(wǎng)絡(luò)庫上面只有 mio,沒有好用的 RPC 框架,HTTP 也不成熟。

但我們還是決定使用 Rust,對于第一點(diǎn),我們團(tuán)隊花了將近一個月的時間來學(xué)習(xí) Rust,跟 Rust 編譯器作斗爭,而對于第二點(diǎn),我們就完全開始自己寫。

幸運(yùn)的,當(dāng)我們越過 Rust 那段陣痛期之后,發(fā)現(xiàn)用 Rust 開發(fā) TiKV 異常的高效,這也就是為啥我們能在短時間開發(fā)出 TiKV 并在生產(chǎn)環(huán)境中上線的原因。

一致性協(xié)議

對于分布式系統(tǒng)來說,CAP 是一個不得不考慮的問題,因為 P 也就是 Partition Tolerance 是一定存在的,所以我們就要考慮到底是選擇 C - Consistency 還是 A - Availability。

我們在設(shè)計 TiKV 的時候就決定 - 完全保證數(shù)據(jù)安全性,所以自然就會選擇 C,但其實我們并沒有完全放棄 A,因為多數(shù)時候,畢竟斷網(wǎng),機(jī)器停電不會特別頻繁,我們只需要保證 HA - High Availability,也就是 4 個 9 或者 5 個 9 的可用性就可以了。

既然選擇了 C,我們下一個就考慮的是選用哪一種分布式一致性算法,現(xiàn)在流行的無非就是 Paxos 或者 Raft,而 Raft 因為簡單,容易理解,以及有很多現(xiàn)成的開源庫可以參考,自然就成了我們的首要選擇。

在 Raft 的實現(xiàn)上,我們直接參考的 etcd 的 Raft。etcd 已經(jīng)被大量的公司在生產(chǎn)環(huán)境中使用,所以它的 Raft 庫質(zhì)量是很有保障的。雖然 etcd 是用 Go 實現(xiàn)的,但它的 Raft library 是類似 C 的實現(xiàn),所以非常便于我們用 Rust 直接翻譯。在翻譯的過程中,我們也給 etcd 的 Raft fix 了一些 bug,添加了一些功能,讓其變得更加健壯和易用。

現(xiàn)在 Raft 的代碼仍然在 TiKV 工程里面,但我們很快會將獨(dú)立出去,變成獨(dú)立的 library,這樣大家就能在自己的 Rust 項目中使用 Raft 了。

使用 Raft 不光能保證數(shù)據(jù)的一致性,也可以借助 Raft 的 Configuration Change 機(jī)制實現(xiàn)系統(tǒng)的水平擴(kuò)展,這個我們會在后面的文章中詳細(xì)的說明。

存儲引擎

選擇了分布式一致性協(xié)議,下一個就要考慮數(shù)據(jù)存儲的問題了。在 TiKV 里面,我們會存儲 Raft log,然后也會將 Raft log 里面實際的客戶請求應(yīng)用到狀態(tài)機(jī)里面。

首先來看狀態(tài)機(jī),因為它會存放用戶的實際數(shù)據(jù),而這些數(shù)據(jù)完全可能是隨機(jī)的 key - value,為了高效的處理隨機(jī)的數(shù)據(jù)插入,自然我們就考慮使用現(xiàn)在通用的 LSM Tree 模型。而在這種模型下,RocksDB 可以認(rèn)為是現(xiàn)階段最優(yōu)的一個選擇。

RocksDB 是 Facebook 團(tuán)隊在 LevelDB 的基礎(chǔ)上面做的高性能 Key-Value Storage,它提供了很多配置選項,能讓大家根據(jù)不同的硬件環(huán)境去調(diào)優(yōu)。這里有一個梗,說的是因為 RocksDB 配置太多,以至于連 RocksDB team 的同學(xué)都不清楚所有配置的意義。

關(guān)于我們在 TiKV 中如何使用,優(yōu)化 RocksDB,以及給 RocksDB 添加功能,fix bug 這些,我們會在后面文章中詳細(xì)說明。

而對于 Raft Log,因為任意 Log 的 index 是完全單調(diào)遞增的,譬如 Log 1,那么下一個 Log 一定是 Log 2,所以 Log 的插入可以認(rèn)為是順序插入。這種的,最通常的做法就是自己寫一個 Segment File,但現(xiàn)在我們?nèi)匀皇褂玫氖?RocksDB,因為 RocksDB 對于順序?qū)懭胍灿蟹浅8叩男阅?,也能滿足我們的需求。但我們不排除后面使用自己的引擎。

因為 RocksDB 提供了 C API,所以可以直接在 Rust 里面使用,大家也可以在自己的 Rust 項目里面通過 rust-rocksdb 這個庫來使用 RocksDB。

分布式事務(wù)

要支持分布式事務(wù),首先要解決的就是分布式系統(tǒng)時間的問題,也就是我們用什么來標(biāo)識不同事務(wù)的順序。通常有幾種做法:

TrueTime,TrueTime 是 Google Spanner 使用的方式,不過它需要硬件 GPS + 原子鐘支持,而且 Spanner 并沒有在論文里面詳細(xì)說明硬件環(huán)境是如何搭建的,外面要自己實現(xiàn)難度比較大。

HLC,HLC 是一種混合邏輯時鐘,它使用 Physical Time 和 Logical Clock 來確定事件的先后順序,HLC 已經(jīng)在一些應(yīng)用中使用,但 HLC 依賴 NTP,如果 NTP 精度誤差比較大,很可能會影響 commit wait time。

TSO,TSO 是一個全局授時器,它直接使用一個單點(diǎn)服務(wù)來分配時間。TSO 的方式很簡單,但會有單點(diǎn)故障問題,單點(diǎn)也可能會有性能問題。

TiKV 采用了 TSO 的方式進(jìn)行全局授時,主要是為了簡單。至于單點(diǎn)故障問題,我們通過 Raft 做到了自動 fallover 處理。而對于單點(diǎn)性能問題,TiKV 主要針對的是 PB 以及 PB 以下級別的中小規(guī)模集群,所以在性能上面只要能保證每秒百萬級別的時間分配就可以了,而網(wǎng)絡(luò)延遲上面,TiKV 并沒有全球跨 IDC 的需求,在單 IDC 或者同城 IDC 情況下,網(wǎng)絡(luò)速度都很快,即使是異地 IDC,也因為有專線不會有太大的延遲。

解決了時間問題,下一個問題就是我們采用何種的分布式事務(wù)算法,最通常的就是使用 2 PC,但通常的 2 PC 算法在一些極端情況下面會有問題,所以業(yè)界要不通過 Paxos,要不就是使用 3 PC 等算法。在這里,TiKV 參考 Percolator,使用了另一種增強(qiáng)版的 2 PC 算法。

這里先簡單介紹下 Percolator 的分布式事務(wù)算法,Percolator 使用了樂觀鎖,也就是會先緩存事務(wù)要修改的數(shù)據(jù),然后在 Commit 提交的時候,對要更改的數(shù)據(jù)進(jìn)行加鎖處理,然后再更新。采用樂觀鎖的好處在于對于很多場景能提高整個系統(tǒng)的并發(fā)處理能力,但在沖突嚴(yán)重的情況下反而沒有悲觀鎖高效。

對于要修改的一行數(shù)據(jù),Percolator 會有三個字段與之對應(yīng),Lock,Write 和 Data:

Lock,就是要修改數(shù)據(jù)的實際 lock,在一個 Percolator 事務(wù)里面,有一個 primary key,還有其它 secondary keys, 只有 primary key 先加鎖成功,我們才會再去嘗試加鎖后續(xù)的 secondary keys。

Write,保存的是數(shù)據(jù)實際提交寫入的 commit timestamp,當(dāng)一個事務(wù)提交成功之后,我們就會將對應(yīng)的修改行的 commit timestamp 寫入到 Write 上面。

Data,保存實際行的數(shù)據(jù)。

當(dāng)事務(wù)開始的時候,我們會首先得到一個 start timestamp,然后再去獲取要修改行的數(shù)據(jù),在 Get 的時候,如果這行數(shù)據(jù)上面已經(jīng)有 Lock 了,那么就可能終止當(dāng)前事務(wù),或者嘗試清理 Lock。

當(dāng)我們要提交事務(wù)的時候,先得到 commit timestamp,會有兩個階段:

Prewrite:先嘗試給 primary key 加鎖,然后嘗試給 second keys 加鎖。如果對應(yīng) key 上面已經(jīng)有 Lock,或者在 start timestamp 之后,Write 上面已經(jīng)有新的寫入,Prewrite 就會失敗,我們就會終止這次事務(wù)。在加鎖的時候,我們也會順帶將數(shù)據(jù)寫入到 Data 上面。

Commit:當(dāng)所有涉及的數(shù)據(jù)都加鎖成功之后,我們就可以提交 primay key,這時候會先判斷之前加的 Lock 是否還在,如果還在,則刪掉 Lock,將 commit timestamp 寫入到 Write。當(dāng) primary key 提交成功之后,我們就可以異步提交 second keys,我們不用在乎 primary keys 是否能提交成功,即使失敗了,也有機(jī)制能保證數(shù)據(jù)被正常提交。

用Rust做Web開發(fā)是怎樣的一種體驗

大數(shù)據(jù)成為主流業(yè)務(wù),而R語言顯然是處理大數(shù)據(jù)的最佳工具。

R語言三個優(yōu)勢原因

支持使用缺省值作為核心數(shù)據(jù)值,因而可以很容易地處理不完整的數(shù)據(jù)源,而不完整的數(shù)據(jù)源才是現(xiàn)實中最常見的。

可視化軟件包ggplot2將數(shù)據(jù)與繪圖分離,實現(xiàn)圖層疊加,現(xiàn)在以成為使用最廣泛的R語言拓展包。

頂層語言外殼是可定制的,程序員利用這個功能搭建了集成開發(fā)環(huán)境比如RStudio,這使得R語言更易于學(xué),主要用于商業(yè)方面。

我為什么要選擇Rust

你好,很高興為你解答。

專訪資深程序員莊曉立:我為什么要選擇Rust?

Rust是由Mozilla開發(fā)的注重安全、性能和并發(fā)性的編程語言。這門語言自推出以來就得到了國內(nèi)外程序員的大力推崇。Rust聲稱解決了傳統(tǒng)C語言和C++語言幾十年來飽受責(zé)難的內(nèi)存安全問題,同時還保持了極高的運(yùn)行效率、極深的底層控制、極廣的應(yīng)用范圍。但在國內(nèi)有關(guān)Rust的學(xué)習(xí)文檔并不多見,不久前,筆者聯(lián)系上了Rust1.0版本代碼貢獻(xiàn)者莊曉立(精彩博文:為什么我說Rust是靠譜的編程語言),請他分享Rust語言特性以及學(xué)習(xí)經(jīng)驗。

CSDN:你是從什么時候開始接觸Rust語言的?是什么地方吸引了你?

莊曉立:我大概從2013年后半年開始深入接觸Rust語言。它居然聲稱解決了傳統(tǒng)C語言和C++語言幾十年來飽受責(zé)難的內(nèi)存安全問題,同時還保持了極高的運(yùn)行效率、極深的底層控制、極廣的應(yīng)用范圍。

其ownership機(jī)制令人眼前一亮,無虛擬機(jī)(VM)、無垃圾收集器(GC)、無運(yùn)行時(Runtime)、無空指針/野指針/內(nèi)存越界/緩沖區(qū)溢出/段錯誤、無數(shù)據(jù)競爭(Data Race)……所有這些,都深深地吸引了我——這個十多年以來深受C語言折磨的痛并快樂著的程序員。

CSDN:在你看來,Rust是怎樣的一門語言?它適合開發(fā)什么類型的項目?為何你會說Rust不懼怕任何競爭對手,它既能取代C語言地位;又可挑戰(zhàn)C++市場,還可向Java、Python分一杯羹?與這些語言相比,Rust有哪些優(yōu)越的特性?

莊曉立:Rust是一門系統(tǒng)編程語言,特別適合開發(fā)對CPU和內(nèi)存占用十分敏感的系統(tǒng)軟件,例如虛擬機(jī)(VM)、容器(Container)、數(shù)據(jù)庫/游戲/網(wǎng)絡(luò)服務(wù)器、瀏覽器引擎、模擬器等,而這些向來主要都是C/C++的傳統(tǒng)領(lǐng)地。

此外,Rust在系統(tǒng)底層開發(fā)領(lǐng)域,如裸金屬(bare metal)、操作系統(tǒng)(OS)、內(nèi)核(kernel)、內(nèi)核模塊(mod)等,也有強(qiáng)勁的實力,足以挑戰(zhàn)此領(lǐng)域的傳統(tǒng)老大C語言。Rust豐富的語言特性、先進(jìn)的設(shè)計理念、便捷的項目管理,令它在上層應(yīng)用開發(fā)中也能大展拳腳,至少在運(yùn)行性能上比帶VM和GC的語言要更勝一籌。無GC實現(xiàn)內(nèi)存安全機(jī)制、無數(shù)據(jù)競爭的并發(fā)機(jī)制、無運(yùn)行時開銷的抽象機(jī)制,是Rust獨(dú)特的優(yōu)越特性。

其他語言很難同時實現(xiàn)這些目標(biāo),例如傳統(tǒng)C/C++無法保證內(nèi)存安全,Java/Python等無法消除運(yùn)行時開銷。但Rust畢竟還是很年輕的項目,它釋放影響力需要時間,被世人廣泛接受需要時間;它的潛力能否爆發(fā)出來,需要時間去檢驗。我們只需耐心等待。

CSDN:Rust在國內(nèi)有沒有具體的實際使用案例?

莊曉立:因為Rust1.0正式版剛剛發(fā)布不足一月,在國內(nèi)影響力還不大,我們不能苛求它在國內(nèi)有實際應(yīng)用案例。但是在國外,一兩年前就已經(jīng)有OpenDNS和Skylight把Rust應(yīng)用在生產(chǎn)環(huán)境。還有瀏覽器引擎Servo、Rust編譯器和標(biāo)準(zhǔn)庫、項目管理器Cargo等“兩個半大型應(yīng)用案例”。這些足夠說明Rust語言的成熟和實用。

CSDN:你參與了Rust1.0版本代碼貢獻(xiàn),目前該版本正式版已經(jīng)發(fā)布,對此你感覺如何?這門語言是否已經(jīng)達(dá)到比較成熟的階段?

莊曉立:我積極參與了Rust語言開源項目,多次貢獻(xiàn)源代碼,曾連續(xù)三次出現(xiàn)在Rust官方博客公布的Rust 1.0 alpha、Rust 1.0 beta和Rust 1.0正式版的貢獻(xiàn)者名單中。在Rust 1.0正式版出臺的過程中及此前的很長一段時間,開發(fā)者付出了極大的努力,確保Rust 1.0正式版在Semver 2.0規(guī)范下,務(wù)必保持向后兼容性,除非遇到重大Bug不得不修復(fù)。

我認(rèn)為,在1.0正式發(fā)布之后,Rust就已經(jīng)進(jìn)入了比較成熟的階段。而且,Rust還在快速迭代發(fā)展過程中,1.0發(fā)布6周后將發(fā)布1.1,再6周后將發(fā)布1.2,必然會一步一個臺階,越來越成熟穩(wěn)定。

CSDN:除了功能優(yōu)先級以外,在你看來,Rust正在朝什么方向發(fā)展?未來的Rust可以期待什么樣的特性?

莊曉立:Rust一定會沿著“確保內(nèi)存安全、無運(yùn)行開銷、高效實用”的既定方向持續(xù)發(fā)展。在短期內(nèi)值得期待的語言特性有:動態(tài)Drop、偏特化、繼承、改進(jìn)borrow checker、改進(jìn)宏和語法擴(kuò)展。短期內(nèi)值得期待的其他特性有:增強(qiáng)文件系統(tǒng)API、提供內(nèi)存申請釋放API、更好地支持Windows和ARM、更快的編譯速度、更方便的二進(jìn)制分發(fā)機(jī)制(MUSL)、更實用的工具等等。

CSDN:據(jù)我了解,你之前也比較推崇Go語言,為何想到放棄Go轉(zhuǎn)向Rust?

莊曉立:推崇Go語言還談不上,不過我曾經(jīng)嘗試努力接受Go語言,2011底年開始我曾經(jīng)花費(fèi)將近半年時間深度關(guān)注Go開發(fā)進(jìn)程,提了很多具體的改進(jìn)意見和建議,也曾經(jīng)多次嘗試貢獻(xiàn)源代碼。后來考慮到Go語言的設(shè)計理念跟我偏差太大,其社區(qū)也不太友好,慢慢地疏遠(yuǎn)了它。我曾經(jīng)寫過一篇博客《我為什么放棄Go語言》,談到了很多具體的原因。

CSDN:國內(nèi),參與Rust代碼貢獻(xiàn)的開發(fā)者多嗎?有核心的人員嗎?有哪些社區(qū)在維護(hù)Rust?

莊曉立:國內(nèi)參與Rust代碼貢獻(xiàn)的開發(fā)者并不多,但也不少,官方的貢獻(xiàn)者名單中也偶見幾個貌似國人的名字。Rust的核心開發(fā)人員基本上都是Mozilla公司的員工,他們專職負(fù)責(zé)開發(fā)維護(hù)Rust語言和相關(guān)的項目,Rust社區(qū)也主要是他們參與組織和管理的。社區(qū)人員討論主要集中在GitHub項目主頁RFC/PR/Issue官方、Discuss論壇/IRC、Reddit、HN、StackOverflow等。


分享題目:鴻蒙rust開發(fā),csdn 鴻蒙
轉(zhuǎn)載來源:http://weahome.cn/article/dsdescg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部