go語(yǔ)言實(shí)現(xiàn)pos共識(shí)機(jī)制
1、【golang詳解】go語(yǔ)言GMP(GPM)原理和調(diào)度
Goroutine調(diào)度是一個(gè)很復(fù)雜的機(jī)制,下面嘗試用簡(jiǎn)單的語(yǔ)言描述一下Goroutine調(diào)度機(jī)制,想要對(duì)其有更深入的了解可以去研讀一下源碼。首先介紹一下GMP什么意思:
G ----------- goroutine: 即Go協(xié)程,每個(gè)go關(guān)鍵字都會(huì)創(chuàng)建一個(gè)協(xié)程。
M ---------- thread內(nèi)核級(jí)線程,所有的G都要放在M上才能運(yùn)行。
P ----------- processor處理器,調(diào)度G到M上,其維護(hù)了一個(gè)隊(duì)列,存儲(chǔ)了所有需要它來(lái)調(diào)度的G。
Goroutine 調(diào)度器P和 OS 調(diào)度器是通過(guò) M 結(jié)合起來(lái)的,每個(gè) M 都代表了 1 個(gè)內(nèi)核線程,OS 調(diào)度器負(fù)責(zé)把內(nèi)核線程分配到 CPU 的核上執(zhí)行
模型圖:
避免頻繁的創(chuàng)建、銷毀線程,而是對(duì)線程的復(fù)用。
1)work stealing機(jī)制
當(dāng)本線程無(wú)可運(yùn)行的G時(shí),嘗試從其他線程綁定的P偷取G,而不是銷毀線程。
2)hand off機(jī)制
當(dāng)本線程M0因?yàn)镚0進(jìn)行系統(tǒng)調(diào)用阻塞時(shí),線程釋放綁定的P,把P轉(zhuǎn)移給其他空閑的線程執(zhí)行。進(jìn)而某個(gè)空閑的M1獲取P,繼續(xù)執(zhí)行P隊(duì)列中剩下的G。而M0由于陷入系統(tǒng)調(diào)用而進(jìn)被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來(lái)源有可能是M的緩存池,也可能是新建的。當(dāng)G0系統(tǒng)調(diào)用結(jié)束后,根據(jù)M0是否能獲取到P,將會(huì)將G0做不同的處理:
如果有空閑的P,則獲取一個(gè)P,繼續(xù)執(zhí)行G0。
如果沒(méi)有空閑的P,則將G0放入全局隊(duì)列,等待被其他的P調(diào)度。然后M0將進(jìn)入緩存池睡眠。
如下圖
GOMAXPROCS設(shè)置P的數(shù)量,最多有GOMAXPROCS個(gè)線程分布在多個(gè)CPU上同時(shí)運(yùn)行
在Go中一個(gè)goroutine最多占用CPU 10ms,防止其他goroutine被餓死。
具體可以去看另一篇文章
【Golang詳解】go語(yǔ)言調(diào)度機(jī)制 搶占式調(diào)度
當(dāng)創(chuàng)建一個(gè)新的G之后優(yōu)先加入本地隊(duì)列,如果本地隊(duì)列滿了,會(huì)將本地隊(duì)列的G移動(dòng)到全局隊(duì)列里面,當(dāng)M執(zhí)行work stealing從其他P偷不到G時(shí),它可以從全局G隊(duì)列獲取G。
協(xié)程經(jīng)歷過(guò)程
我們創(chuàng)建一個(gè)協(xié)程 go func()經(jīng)歷過(guò)程如下圖:
說(shuō)明:
這里有兩個(gè)存儲(chǔ)G的隊(duì)列,一個(gè)是局部調(diào)度器P的本地隊(duì)列、一個(gè)是全局G隊(duì)列。新創(chuàng)建的G會(huì)先保存在P的本地隊(duì)列中,如果P的本地隊(duì)列已經(jīng)滿了就會(huì)保存在全局的隊(duì)列中;處理器本地隊(duì)列是一個(gè)使用數(shù)組構(gòu)成的環(huán)形鏈表,它最多可以存儲(chǔ) 256 個(gè)待執(zhí)行任務(wù)。
G只能運(yùn)行在M中,一個(gè)M必須持有一個(gè)P,M與P是1:1的關(guān)系。M會(huì)從P的本地隊(duì)列彈出一個(gè)可執(zhí)行狀態(tài)的G來(lái)執(zhí)行,如果P的本地隊(duì)列為空,就會(huì)想其他的MP組合偷取一個(gè)可執(zhí)行的G來(lái)執(zhí)行;
一個(gè)M調(diào)度G執(zhí)行的過(guò)程是一個(gè)循環(huán)機(jī)制;會(huì)一直從本地隊(duì)列或全局隊(duì)列中獲取G
上面說(shuō)到P的個(gè)數(shù)默認(rèn)等于CPU核數(shù),每個(gè)M必須持有一個(gè)P才可以執(zhí)行G,一般情況下M的個(gè)數(shù)會(huì)略大于P的個(gè)數(shù),這多出來(lái)的M將會(huì)在G產(chǎn)生系統(tǒng)調(diào)用時(shí)發(fā)揮作用。類似線程池,Go也提供一個(gè)M的池子,需要時(shí)從池子中獲取,用完放回池子,不夠用時(shí)就再創(chuàng)建一個(gè)。
work-stealing調(diào)度算法:當(dāng)M執(zhí)行完了當(dāng)前P的本地隊(duì)列隊(duì)列里的所有G后,P也不會(huì)就這么在那躺尸啥都不干,它會(huì)先嘗試從全局隊(duì)列隊(duì)列尋找G來(lái)執(zhí)行,如果全局隊(duì)列為空,它會(huì)隨機(jī)挑選另外一個(gè)P,從它的隊(duì)列里中拿走一半的G到自己的隊(duì)列中執(zhí)行。
如果一切正常,調(diào)度器會(huì)以上述的那種方式順暢地運(yùn)行,但這個(gè)世界沒(méi)這么美好,總有意外發(fā)生,以下分析goroutine在兩種例外情況下的行為。
Go runtime會(huì)在下面的goroutine被阻塞的情況下運(yùn)行另外一個(gè)goroutine:
用戶態(tài)阻塞/喚醒
當(dāng)goroutine因?yàn)閏hannel操作或者network I/O而阻塞時(shí)(實(shí)際上golang已經(jīng)用netpoller實(shí)現(xiàn)了goroutine網(wǎng)絡(luò)I/O阻塞不會(huì)導(dǎo)致M被阻塞,僅阻塞G,這里僅僅是舉個(gè)栗子),對(duì)應(yīng)的G會(huì)被放置到某個(gè)wait隊(duì)列(如channel的waitq),該G的狀態(tài)由_Gruning變?yōu)開(kāi)Gwaitting,而M會(huì)跳過(guò)該G嘗試獲取并執(zhí)行下一個(gè)G,如果此時(shí)沒(méi)有可運(yùn)行的G供M運(yùn)行,那么M將解綁P,并進(jìn)入sleep狀態(tài);當(dāng)阻塞的G被另一端的G2喚醒時(shí)(比如channel的可讀/寫(xiě)通知),G被標(biāo)記為,嘗試加入G2所在P的runnext(runnext是線程下一個(gè)需要執(zhí)行的 Goroutine。), 然后再是P的本地隊(duì)列和全局隊(duì)列。
系統(tǒng)調(diào)用阻塞
當(dāng)M執(zhí)行某一個(gè)G時(shí)候如果發(fā)生了阻塞操作,M會(huì)阻塞,如果當(dāng)前有一些G在執(zhí)行,調(diào)度器會(huì)把這個(gè)線程M從P中摘除,然后再創(chuàng)建一個(gè)新的操作系統(tǒng)的線程(如果有空閑的線程可用就復(fù)用空閑線程)來(lái)服務(wù)于這個(gè)P。當(dāng)M系統(tǒng)調(diào)用結(jié)束時(shí)候,這個(gè)G會(huì)嘗試獲取一個(gè)空閑的P執(zhí)行,并放入到這個(gè)P的本地隊(duì)列。如果獲取不到P,那么這個(gè)線程M變成休眠狀態(tài), 加入到空閑線程中,然后這個(gè)G會(huì)被放入全局隊(duì)列中。
隊(duì)列輪轉(zhuǎn)
可見(jiàn)每個(gè)P維護(hù)著一個(gè)包含G的隊(duì)列,不考慮G進(jìn)入系統(tǒng)調(diào)用或IO操作的情況下,P周期性的將G調(diào)度到M中執(zhí)行,執(zhí)行一小段時(shí)間,將上下文保存下來(lái),然后將G放到隊(duì)列尾部,然后從隊(duì)列中重新取出一個(gè)G進(jìn)行調(diào)度。
除了每個(gè)P維護(hù)的G隊(duì)列以外,還有一個(gè)全局的隊(duì)列,每個(gè)P會(huì)周期性地查看全局隊(duì)列中是否有G待運(yùn)行并將其調(diào)度到M中執(zhí)行,全局隊(duì)列中G的來(lái)源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會(huì)周期性地查看全局隊(duì)列,也是為了防止全局隊(duì)列中的G被餓死。
除了每個(gè)P維護(hù)的G隊(duì)列以外,還有一個(gè)全局的隊(duì)列,每個(gè)P會(huì)周期性地查看全局隊(duì)列中是否有G待運(yùn)行并將其調(diào)度到M中執(zhí)行,全局隊(duì)列中G的來(lái)源,主要有從系統(tǒng)調(diào)用中恢復(fù)的G。之所以P會(huì)周期性地查看全局隊(duì)列,也是為了防止全局隊(duì)列中的G被餓死。
M0
M0是啟動(dòng)程序后的編號(hào)為0的主線程,這個(gè)M對(duì)應(yīng)的實(shí)例會(huì)在全局變量rutime.m0中,不需要在heap上分配,M0負(fù)責(zé)執(zhí)行初始化操作和啟動(dòng)第一個(gè)G,在之后M0就和其他的M一樣了
G0
G0是每次啟動(dòng)一個(gè)M都會(huì)第一個(gè)創(chuàng)建的goroutine,G0僅用于負(fù)責(zé)調(diào)度G,G0不指向任何可執(zhí)行的函數(shù),每個(gè)M都會(huì)有一個(gè)自己的G0,在調(diào)度或系統(tǒng)調(diào)用時(shí)會(huì)使用G0的棧空間,全局變量的G0是M0的G0
一個(gè)G由于調(diào)度被中斷,此后如何恢復(fù)?
中斷的時(shí)候?qū)⒓拇嫫骼锏臈P畔ⅲ4娴阶约旱腉對(duì)象里面。當(dāng)再次輪到自己執(zhí)行時(shí),將自己保存的棧信息復(fù)制到寄存器里面,這樣就接著上次之后運(yùn)行了。
我這里只是根據(jù)自己的理解進(jìn)行了簡(jiǎn)單的介紹,想要詳細(xì)了解有關(guān)GMP的底層原理可以去看Go調(diào)度器 G-P-M 模型的設(shè)計(jì)者的文檔或直接看源碼
參考: (https://www.cnblogs.com/X-knight/p/11365929.html)
(https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-goroutine/)
2、GO語(yǔ)言商業(yè)案例(六):PayPal
創(chuàng)建 PayPal 的目的是使金融服務(wù)民主化,并使個(gè)人和企業(yè)能夠加入并在全球經(jīng)濟(jì)中蓬勃發(fā)展。這項(xiàng)工作的核心是 PayPal 的支付平臺(tái),該平臺(tái)使用專有技術(shù)和第三方技術(shù)的組合來(lái)高效、安全地促進(jìn)全球數(shù)百萬(wàn)商家和消費(fèi)者之間的交易。隨著支付平臺(tái)變得越來(lái)越大、越來(lái)越復(fù)雜,PayPal 尋求對(duì)其系統(tǒng)進(jìn)行現(xiàn)代化改造并縮短新應(yīng)用程序的上市時(shí)間。Go 在生成干凈、高效的代碼方面的有著極高的價(jià)值。這些代碼可以隨著軟件部署的擴(kuò)展而輕松擴(kuò)展,這使得該語(yǔ)言非常適合支持 PayPal 的目標(biāo)。
支付處理平臺(tái)的核心是 PayPal 用 C++ 開(kāi)發(fā)的專有 NoSQL 數(shù)據(jù)庫(kù)。然而,代碼的復(fù)雜性大大降低了開(kāi)發(fā)人員發(fā)展平臺(tái)的能力。Go 的簡(jiǎn)單代碼布局、goroutine(輕量級(jí)執(zhí)行線程)和通道(用作連接并發(fā) goroutine 的管道)使 Go 成為 NoSQL 開(kāi)發(fā)團(tuán)隊(duì)簡(jiǎn)化和現(xiàn)代化平臺(tái)的自然選擇。
作為概念驗(yàn)證,一個(gè)開(kāi)發(fā)團(tuán)隊(duì)花了六個(gè)月的時(shí)間學(xué)習(xí) Go 并在 Go 中從頭開(kāi)始重新實(shí)現(xiàn) NoSQL 系統(tǒng),在此期間,他們還提供了有關(guān)如何在 PayPal 更廣泛地實(shí)施 Go 的見(jiàn)解。截至今天,已遷移 30% 的集群以使用新的 NoSQL 數(shù)據(jù)庫(kù)。
隨著 PayPal 的平臺(tái)變得越來(lái)越復(fù)雜,Go 提供了一種輕松簡(jiǎn)化大規(guī)模創(chuàng)建和運(yùn)行軟件的復(fù)雜性的方法。該語(yǔ)言為 PayPal 提供了出色的庫(kù)和快速工具,以及并發(fā)、垃圾收集和類型安全。
借助 Go,PayPal 使其開(kāi)發(fā)人員能夠?qū)⒏鄷r(shí)間從 C++ 和 Java 開(kāi)發(fā)的噪音中解放出來(lái),從而能夠花更多時(shí)間查看代碼和進(jìn)行戰(zhàn)略性思考。
在這個(gè)新改寫(xiě)的 NoSQL 系統(tǒng)取得成功后,PayPal 內(nèi)更多的平臺(tái)和內(nèi)容團(tuán)隊(duì)開(kāi)始采用 Go。Natarajan 目前的團(tuán)隊(duì)負(fù)責(zé) PayPal 的構(gòu)建、測(cè)試和發(fā)布管道——所有這些都是在 Go 中構(gòu)建的。該公司擁有一個(gè)大型構(gòu)建和測(cè)試農(nóng)場(chǎng),它使用 Go 基礎(chǔ)設(shè)施進(jìn)行完全管理,以支持整個(gè)公司的開(kāi)發(fā)人員的構(gòu)建即服務(wù)(和測(cè)試即服務(wù))。
憑借 PayPal 所需的分布式計(jì)算能力,Go 是刷新系統(tǒng)的正確語(yǔ)言。PayPal 需要并發(fā)和并行的編程,為高性能和高度可移植性而編譯,并為開(kāi)發(fā)人員帶來(lái)模塊化、可組合的開(kāi)源架構(gòu)的好處——Go 已經(jīng)提供了所有這些以及更多幫助 PayPal 對(duì)其系統(tǒng)進(jìn)行現(xiàn)代化改造。
安全性和可支持性是 PayPal 的關(guān)鍵問(wèn)題,該公司的運(yùn)營(yíng)管道越來(lái)越多地由 Go 主導(dǎo),因?yàn)樵撜Z(yǔ)言的簡(jiǎn)潔性和模塊化幫助他們實(shí)現(xiàn)了這些目標(biāo)。PayPal 對(duì) Go 的部署為開(kāi)發(fā)人員提供了一個(gè)創(chuàng)意平臺(tái),使他們能夠?yàn)?PayPal 的全球市場(chǎng)大規(guī)模生產(chǎn)簡(jiǎn)單、高效和可靠的軟件。
隨著 PayPal 繼續(xù)使用 Go 對(duì)其軟件定義網(wǎng)絡(luò) (SDN) 基礎(chǔ)設(shè)施進(jìn)行現(xiàn)代化改造,除了更易于維護(hù)的代碼外,他們還看到了性能優(yōu)勢(shì)。例如,Go 現(xiàn)在為路由器、負(fù)載平衡和越來(lái)越多的生產(chǎn)系統(tǒng)提供動(dòng)力。
作為一家全球性企業(yè),PayPal 需要其開(kāi)發(fā)團(tuán)隊(duì)有效管理兩種規(guī)模:生產(chǎn)規(guī)模,尤其是與許多其他服務(wù)器(如云服務(wù))交互的并發(fā)系統(tǒng);和開(kāi)發(fā)規(guī)模,尤其是由許多程序員協(xié)同開(kāi)發(fā)的大型代碼庫(kù)(如開(kāi)源開(kāi)發(fā))
PayPal 利用 Go 來(lái)解決這些規(guī)模問(wèn)題。該公司的開(kāi)發(fā)人員受益于 Go 將解釋型動(dòng)態(tài)類型語(yǔ)言的編程易用性與靜態(tài)類型編譯語(yǔ)言的效率和安全性相結(jié)合的能力。隨著 PayPal 對(duì)其系統(tǒng)進(jìn)行現(xiàn)代化改造,對(duì)網(wǎng)絡(luò)和多核計(jì)算的支持至關(guān)重要。Go 不僅提供了這種支持,而且提供的速度很快——在單臺(tái)計(jì)算機(jī)上編譯一個(gè)大型可執(zhí)行文件最多需要幾秒鐘。
PayPal 目前有 100 多名 Go 開(kāi)發(fā)人員,未來(lái)選擇采用 Go 的開(kāi)發(fā)人員將更容易獲得該語(yǔ)言的批準(zhǔn),這要?dú)w功于公司已經(jīng)在生產(chǎn)中的許多成功實(shí)現(xiàn)。
最重要的是,PayPal 開(kāi)發(fā)人員使用 Go 提高了他們的生產(chǎn)力。Go 的并發(fā)機(jī)制使得編寫(xiě)充分利用 PayPal 的多核和聯(lián)網(wǎng)機(jī)器的程序變得很容易。使用 Go 的開(kāi)發(fā)人員還受益于它可以快速編譯為機(jī)器代碼的事實(shí),并且他們的應(yīng)用程序獲得了垃圾收集的便利和運(yùn)行時(shí)反射的強(qiáng)大功能。
今天 PayPal 的第一類語(yǔ)言是 Java 和 Node,Go 主要用作基礎(chǔ)設(shè)施語(yǔ)言。雖然 Go 可能永遠(yuǎn)不會(huì)在某些應(yīng)用程序中取代 Node.js,但 Natarajan 正在推動(dòng)讓 Go 成為 PayPal 的第一類語(yǔ)言。
通過(guò)他的努力,PayPal 還在評(píng)估遷移到 Google Kubernetes Engine (GKE) 以加快其新產(chǎn)品的上市時(shí)間。GKE 是一個(gè)用于部署容器化應(yīng)用程序的托管、生產(chǎn)就緒環(huán)境,并帶來(lái)了 Google 在開(kāi)發(fā)人員生產(chǎn)力、自動(dòng)化操作和開(kāi)源靈活性方面的最新創(chuàng)新。
對(duì)于 PayPal 而言,部署到 GKE 將使 PayPal 更容易部署、更新和管理其應(yīng)用程序和服務(wù),從而實(shí)現(xiàn)快速開(kāi)發(fā)和迭代。此外,PayPal 會(huì)發(fā)現(xiàn)更容易運(yùn)行機(jī)器學(xué)習(xí)、通用 GPU、高性能計(jì)算和其他受益于 GKE 支持的專用硬件加速器的工作負(fù)載。
對(duì) PayPal 來(lái)說(shuō)最重要的是,Go 開(kāi)發(fā)和 GKE 的結(jié)合使公司能夠輕松擴(kuò)展以滿足需求,因?yàn)?Kubernetes 自動(dòng)擴(kuò)展將使 PayPal 能夠處理用戶對(duì)服務(wù)不斷增長(zhǎng)的需求——在最重要的時(shí)候保持它們可用,然后在安靜的時(shí)間來(lái)省錢。
3、GO語(yǔ)言商業(yè)案例(十六):Curve-
Golang 的創(chuàng)建是為了實(shí)現(xiàn)最大的用戶效率和編碼效率。已經(jīng)熟悉 Java 或 PHP 的程序員可以在幾周內(nèi)接受 Go 的培訓(xùn)(許多人最終會(huì)更喜歡它)。在本文中,Dewet Diener 探討了 Golang 的優(yōu)缺點(diǎn),以及它的測(cè)試驅(qū)動(dòng)開(kāi)發(fā) (TDD) 如何完美契合。Golang 由 Google 開(kāi)發(fā)和設(shè)計(jì),于 2009 年作為一種綜合性編程語(yǔ)言首次出現(xiàn),旨在最大限度地提高編碼效率。創(chuàng)建該語(yǔ)言的目的是修正其他已建立語(yǔ)言的缺陷。盡管 Golang(或簡(jiǎn)稱為“Go”)是一門年輕的語(yǔ)言,但已經(jīng)積累了大量的開(kāi)發(fā)人員,因此我們想分享為什么在 Curve 我們喜歡 Golang,以及我們?nèi)绾尾捎盟鼇?lái)實(shí)現(xiàn)我們移動(dòng)銀行業(yè)務(wù)的目標(biāo)到云端。
Go 是一種精致的編程語(yǔ)言:它支持“所見(jiàn)即所得”的原則,這意味著清晰易讀的代碼和更少的復(fù)雜抽象。該語(yǔ)言本身易于使用且易于訓(xùn)練。盡管如此,作為一個(gè)相對(duì)較新的生態(tài)系統(tǒng),要找到對(duì) Go 具有廣泛預(yù)先知識(shí)的工程師可能會(huì)很棘手。
然而,與其他編程語(yǔ)言不同,Go 的創(chuàng)建是為了最大限度地提高用戶效率。因此,具有 Java 或 PHP 背景的開(kāi)發(fā)人員和工程師可以在幾周內(nèi)獲得使用 Go 的技能和培訓(xùn)——根據(jù)我們的經(jīng)驗(yàn),他們中的許多人最終更喜歡它。
在 Curve,我們大力提倡測(cè)試驅(qū)動(dòng)開(kāi)發(fā) (TDD),Go 的框架與這種方法保持一致。通過(guò)簡(jiǎn)單地命名一個(gè)文件 foo_test.go 并在該文件中添加結(jié)構(gòu)化測(cè)試函數(shù),Go 將快速有效地運(yùn)行您的單元測(cè)試。這一創(chuàng)新功能提高了生產(chǎn)力,因?yàn)樗梢愿訉W⒂跍y(cè)試驅(qū)動(dòng)的開(kāi)發(fā)和改進(jìn)的同行評(píng)審機(jī)會(huì)。
Golang 具有出色的生產(chǎn)優(yōu)化品質(zhì),例如內(nèi)存占用小,這支持其在大型項(xiàng)目中作為構(gòu)建塊的能力,以及開(kāi)箱即用的與其他架構(gòu)的輕松交叉編譯。由于 Go 代碼被編譯為單個(gè)靜態(tài)二進(jìn)制文件,因此它可以輕松進(jìn)行容器化,并且通過(guò)擴(kuò)展,將 Go 部署到任何高可用性環(huán)境(例如 Kubernetes)中幾乎是微不足道的。
它提供了一種機(jī)制來(lái)保護(hù)工作負(fù)載,通過(guò)擁有非常纖薄的生產(chǎn)容器而沒(méi)有任何無(wú)關(guān)的依賴項(xiàng)。這使得構(gòu)建、部署和維護(hù)基于 Go 的資產(chǎn)更加直接和安全,并為希望建立或發(fā)展其微服務(wù)戰(zhàn)略的公司提供了可靠的選擇。
Go 是專門為滿足我們快速發(fā)展的技術(shù)生態(tài)系統(tǒng)的需求而創(chuàng)建的。例如,Go 可以滿足您構(gòu)建 API 所需的一切,并將其作為其標(biāo)準(zhǔn)庫(kù)的一部分。它使用簡(jiǎn)單,高性能的 http 服務(wù)器消除了團(tuán)隊(duì)設(shè)計(jì)新項(xiàng)目時(shí)經(jīng)常發(fā)生的一些常見(jiàn)的 探索 和設(shè)計(jì)癱瘓問(wèn)題——這對(duì)于一些其他流行語(yǔ)言(如 Java 和 Node.js)來(lái)說(shuō)太常見(jiàn)了。
Golang 還通過(guò)其內(nèi)置于語(yǔ)言本身的自動(dòng)格式化程序巧妙地解決了代碼格式化分歧。這完全消除了格式爭(zhēng)議,進(jìn)而提高了團(tuán)隊(duì)的生產(chǎn)力和注意力。
盡管我是 Go 的擁護(hù)者,但它顯然也不是沒(méi)有缺陷。一個(gè)爭(zhēng)論不休的特性是 Go 沒(méi)有顯式接口,這是許多開(kāi)發(fā)人員習(xí)慣的概念。雖然不是有害的,但它可以使選擇最適合您的結(jié)構(gòu)的接口成為一項(xiàng)任務(wù)。這是因?yàn)槟粫?huì)像在其他流行的編程語(yǔ)言中那樣編寫(xiě) X 實(shí)現(xiàn) Y,但您很快就會(huì)接受。
依賴管理也是另一個(gè)不屬于 Google Golang 開(kāi)發(fā)團(tuán)隊(duì)原始設(shè)計(jì)的功能。開(kāi)源社區(qū)介入并創(chuàng)建了 Glide 和 Dep,最初的努力并沒(méi)有完全解決問(wèn)題。從 Go 1.11 開(kāi)始,添加了對(duì)模塊的支持,這似乎已成為官方的依賴管理工具。這些挑戰(zhàn)并沒(méi)有削弱 Go 作為一種高效編程語(yǔ)言的獨(dú)創(chuàng)性,并且它繼續(xù)為我們提供優(yōu)于其他編程語(yǔ)言的顯著優(yōu)勢(shì)。
Golang 吸引了全球敏銳的開(kāi)發(fā)人員的注意,并且圍繞它的興奮繼續(xù)增長(zhǎng)。開(kāi)源社區(qū)因有趣的項(xiàng)目而蓬勃發(fā)展;最著名的是 Docker 和 Kubernetes。
正是這種新鮮、有創(chuàng)意但又簡(jiǎn)單的包裝吸引了我們?nèi)o:它是一種令人興奮的編碼語(yǔ)言,可以幫助我們?cè)?Curve 中快速開(kāi)發(fā)以構(gòu)建更好的產(chǎn)品。
4、go語(yǔ)言--Goroutines
1、goroutine:在go語(yǔ)言中,每一個(gè)并發(fā)的執(zhí)行單元叫做goroutine,如果一個(gè)程序中包含多個(gè)goroutine,對(duì)兩個(gè)函數(shù)的調(diào)用則可能發(fā)生在同一時(shí)刻2、main goroutine:當(dāng)一個(gè)程序啟動(dòng)時(shí),其主函數(shù)即在一個(gè)單獨(dú)的goroutine中運(yùn)行,我們叫他為main gorountine
3、go goroutine:新的goroutine會(huì)用go語(yǔ)句來(lái)創(chuàng)建,go+函數(shù)名,go語(yǔ)句會(huì)使其語(yǔ)句中的函數(shù)在一新創(chuàng)建的goroutine中運(yùn)行,而go語(yǔ)句本身會(huì)迅速地完成
4、goroutine的退出:主函數(shù)返回時(shí),所有的goroutine都會(huì)被直接打斷,程序退出,除了從主函數(shù)退出或者終止程序之外,沒(méi)有其他方法能夠讓一個(gè)goroutine來(lái)打斷另一個(gè)的執(zhí)行,但是可以通過(guò)另一種方式來(lái)實(shí)現(xiàn)這個(gè)目的,通過(guò)goroutine之間的通信來(lái)讓一個(gè)goroutine請(qǐng)求其他的goroutine,并讓請(qǐng)求的goroutine自行結(jié)束執(zhí)行
5、兩種共識(shí)機(jī)制對(duì)比(PoW vs PoS)
區(qū)塊鏈中最核心的架構(gòu)就是共識(shí)機(jī)制,可以說(shuō)是區(qū)塊鏈的驅(qū)動(dòng)引擎,發(fā)展這么多年,目前主流比較明確經(jīng)得住考驗(yàn)的就只剩下PoW(Proof of Work)與PoS(Proof of Stake)兩種機(jī)制。簡(jiǎn)單概述下,PoW系統(tǒng)的特點(diǎn)是通過(guò)消耗大量算力來(lái)計(jì)算特定算法的解(典型如哈希),第一個(gè)算出結(jié)果的有權(quán)生成區(qū)塊,同時(shí)也會(huì)得到coin作為獎(jiǎng)勵(lì)(這也是coin的生產(chǎn)與分發(fā)過(guò)程,形象地稱為Mining),采用PoW的典型區(qū)塊鏈有Bitcoin和Ethereum,目前PoW也是運(yùn)行時(shí)間最長(zhǎng),被公認(rèn)為是最可靠安全的共識(shí)機(jī)制; 其本質(zhì)是通過(guò)消耗大量算力來(lái)實(shí)現(xiàn)系統(tǒng)內(nèi)的逆熵過(guò)程,保證系統(tǒng)的長(zhǎng)期安全與穩(wěn)定 。但PoW被廣為詬病的也是其消耗太多的能源資源,這方面PoS就被認(rèn)為是更為綠色的解決方案,顧名思義PoS是通過(guò)質(zhì)押系統(tǒng)中的資產(chǎn)即coin來(lái)成為一個(gè)質(zhì)押者(staker),這樣就有權(quán)產(chǎn)出區(qū)塊,質(zhì)押份額越多,獲得產(chǎn)出區(qū)塊權(quán)的概率就越高,也代表著獎(jiǎng)勵(lì)越多。
在分布式系統(tǒng)中有一個(gè) CAP 定理,是指一個(gè)分布式系統(tǒng)中存在著三元悖論,即不可能同時(shí)滿足這三個(gè)特性:一致性(Consistency)、可用性(Availability)和分區(qū)容錯(cuò)性 (Partition tolerance),而只能滿足其中兩個(gè)。區(qū)塊鏈作為一種分布式網(wǎng)絡(luò),這個(gè)定理也逐漸演變成了區(qū)塊鏈的三元悖論,即 安全性(Security) 、 去中心化(Decentralization) 和 可擴(kuò)展性 (Scalability) ,也是同時(shí)只能滿足兩個(gè)特性。
整體上看PoW系統(tǒng)更注重的是 安全性(Security) 與 去中心化(Decentralization) ,放棄 可擴(kuò)展性 (Scalability) ,這也是Bitcoin網(wǎng)絡(luò)的吞吐量非常慢的原因。而PoS系統(tǒng)更關(guān)注的是 可擴(kuò)展性 (Scalability) 與 去中心化(Decentralization) ,但就PoS能否真的 實(shí)現(xiàn) 去中心化(Decentralization) ,我是比較持懷疑態(tài)度的。從保守主義與系統(tǒng)的更長(zhǎng)期穩(wěn)定的角度出發(fā),我個(gè)人是堅(jiān)定地站在PoW這邊的,可能跟自身保守的性格有關(guān),并不是特別看好PoS作為基礎(chǔ)層能比較穩(wěn)定。特別是像這次 5月份的Luna事件 ,事件大概的過(guò)程是Luna鏈上的算法穩(wěn)定幣UST缺乏價(jià)值支撐最終脫錨,其核心問(wèn)題在于UST的錨定設(shè)計(jì)試圖用一個(gè)PoS股權(quán)系統(tǒng)去支撐其錨定美元,而且還超發(fā)了太多UST,再加上UST與Luna的兌換設(shè)計(jì)缺陷最終導(dǎo)致Luna自身的死亡螺旋。但這個(gè)事件更大的意義應(yīng)該是敲響了一個(gè)警鐘,PoS機(jī)制在面對(duì)空頭資本砸盤時(shí)真的還能維持穩(wěn)定、維持所謂的去中心化嗎?可能到時(shí)節(jié)點(diǎn)數(shù)量萎縮的速度會(huì)很快,逐漸趨于中心化。
所有系統(tǒng)設(shè)計(jì)都需要根據(jù)自身定位來(lái)折中,以下從價(jià)值錨定的角度,簡(jiǎn)單分析下為什么長(zhǎng)期來(lái)看PoW會(huì)更有優(yōu)勢(shì)。
在PoW系統(tǒng)中三股主要的參與者分別是研發(fā)人員,投資者(或者叫用戶)與Miner,這三者的相互制衡,使得這個(gè)系統(tǒng)達(dá)到一個(gè)穩(wěn)定平衡的狀態(tài)。而PoS系統(tǒng)中,將Miner這個(gè)重要的制衡力量移除了,投資者和Miner變成了同一群體 質(zhì)押者(stakers) ,因此該群體濫用權(quán)力的行為會(huì)變得相對(duì)不受限制,并且該鏈隨后的發(fā)展方向也可能會(huì)更加不平衡,更容易傾向有利于 質(zhì)押者(stakers) 群體的方向。
PoW系統(tǒng)很好的闡述了什么是被普遍認(rèn)可的價(jià)值,抽象上來(lái)看就是高代價(jià)的稀缺性 ,高代價(jià)與稀缺性兩者缺一不可。PoS最多只能實(shí)現(xiàn)其中一個(gè)稀缺性。
Miner為了在鏈上生產(chǎn)區(qū)塊賺取coin,不僅需要持續(xù)支付高額電力成本,還必須不斷投入研發(fā)、升級(jí)硬件、優(yōu)化基礎(chǔ)設(shè)施和運(yùn)營(yíng)規(guī)模來(lái)保持其競(jìng)爭(zhēng)力。最終結(jié)果是,能夠長(zhǎng)期持續(xù)盈利的Miner并不會(huì)是一個(gè)一層不變的群體,而是總在競(jìng)爭(zhēng)中淘汰掉效率太低的Miner,使高效率的Miner能存活下來(lái)。這也更有利于 去中心化(Decentralization) ,因?yàn)椴粩嘧兓腗iner群體意味著沒(méi)有一個(gè)Miner可以在相當(dāng)長(zhǎng)的時(shí)間內(nèi)保持網(wǎng)絡(luò)的大部分算力,除非他們通過(guò)嚴(yán)酷的競(jìng)爭(zhēng)考驗(yàn),不斷優(yōu)化自身來(lái)提供更多的算力。
而PoS系統(tǒng)中的質(zhì)押者實(shí)際上并多少真正的風(fēng)險(xiǎn)投入,也沒(méi)有優(yōu)勝劣汰的嚴(yán)酷競(jìng)爭(zhēng)機(jī)制,他們只需要簡(jiǎn)單地運(yùn)行一個(gè)staker節(jié)點(diǎn)就可以躺著賺利息,本質(zhì)上只是將自己在銀行系統(tǒng)里的錢簡(jiǎn)單的轉(zhuǎn)化為鏈上資本,就可以坐地收割后進(jìn)入這個(gè)系統(tǒng)的新人。這種行為并沒(méi)有太多難度,只是簡(jiǎn)單地賺取“無(wú)風(fēng)險(xiǎn)”利息,他們并沒(méi)有將資本轉(zhuǎn)化為任何形式的需要面臨風(fēng)險(xiǎn)考驗(yàn)的投資。
而且當(dāng)發(fā)生硬分叉時(shí),PoW的Miner選擇支持哪條鏈時(shí)會(huì)更為謹(jǐn)慎,因?yàn)樗麄冃枰度敫甙旱碾娏Τ杀緛?lái)為他們的選擇背書(shū),一旦選錯(cuò)了將損失所有投入成本。PoS系統(tǒng)如果發(fā)生硬分叉,質(zhì)押的coin作為系統(tǒng)內(nèi)部狀態(tài)的一部分,硬分叉后質(zhì)押者將在兩條不同鏈上都擁有相同數(shù)量的資產(chǎn),由于沒(méi)有什么沉默成本,導(dǎo)致質(zhì)押者更愿意兩邊都支持,從而使硬分叉更容易且更頻繁地出現(xiàn),這被稱為 nothing at stake 問(wèn)題。
PoW是真正能做到無(wú)準(zhǔn)入限制的(Permissionless),就是說(shuō)已經(jīng)在這個(gè)系統(tǒng)中的老人無(wú)法限制新人加入,只要你有能力提供算力,就能直接接入網(wǎng)絡(luò)中產(chǎn)出coin。而PoS系統(tǒng)中,新人要進(jìn)入,都不得不先從老人手中買coin。
而且PoW中Miner為了支付各種高昂成本(電力,設(shè)備,基礎(chǔ)設(shè)施等),產(chǎn)出coin后也不得不賣出一些以彌補(bǔ)成本,這同時(shí)也是一種把coin分發(fā)給更多人的過(guò)程; 特別是在熊市,Miner為了維持開(kāi)銷也不得不低價(jià)賤賣coin,這樣新人才有機(jī)會(huì)以相對(duì)低的成本獲得籌碼入場(chǎng),這才是一個(gè)健康的生態(tài)擴(kuò)張過(guò)程 。而PoS中由于質(zhì)押者并沒(méi)有什么運(yùn)行成本,也不需要面對(duì)太多競(jìng)爭(zhēng),質(zhì)押者出塊得到coin后不需要急著賣出,更容易哄抬價(jià)格,其實(shí)會(huì)變相激勵(lì)場(chǎng)內(nèi)老人剝削新入場(chǎng)者,不給后來(lái)人更多機(jī)會(huì);整個(gè)系統(tǒng)會(huì)趨向于更封閉,逐漸演變成一個(gè)有限游戲,長(zhǎng)期運(yùn)行下去只會(huì)越來(lái)越中心化;系統(tǒng)中財(cái)富越來(lái)越集中,富者更富,窮者更窮,從而更不可能實(shí)現(xiàn) 去中心化(Decentralization) 。
由于PoW系統(tǒng)中是以提供工作量的方式產(chǎn)出區(qū)塊的,隨著時(shí)間的推移這些工作量都會(huì)被累積起來(lái)并使鏈不斷向前延伸,這也是為什么叫區(qū)塊鏈;這些累積的工作量也給攻擊者造成了巨大障礙,如果想要反轉(zhuǎn)整條鏈,不僅需要非常高的算力,還需要相當(dāng)長(zhǎng)的時(shí)間,這也為應(yīng)對(duì)攻擊提供了足夠長(zhǎng)的時(shí)間緩沖。
而PoS系統(tǒng)其實(shí)只是維護(hù)一個(gè)分布式賬本, 并沒(méi)有工作量累積的概念,一旦攻擊成功,要反轉(zhuǎn)整條鏈就是相當(dāng)容易的,幾分鐘就可以搞定。
嚴(yán)格來(lái)說(shuō)由PoW算力支撐的BTC不應(yīng)歸為高科技類,由于它整個(gè)系統(tǒng)架構(gòu)更保守更穩(wěn)定,提供的更多的是一種 物化價(jià)值(objective costliness) ,更能作為價(jià)值之錨,所以數(shù)字黃金這個(gè)稱號(hào)很貼切。而像ETH(目前還是PoW,2.0升級(jí)后為PoS)這些更接近科技類創(chuàng)新平臺(tái),PoS本質(zhì)上更像是一種股權(quán)系統(tǒng),其實(shí)PoS系統(tǒng)反而是需要中心化,偏向更依靠整個(gè)社區(qū)的生命力,需要依靠核心團(tuán)隊(duì)的創(chuàng)新與開(kāi)拓能力往前走;而PoW則需要去中心化,更偏向穩(wěn)定與提供 物化價(jià)值(objective costliness) 。
區(qū)塊鏈作為一個(gè)價(jià)值分配系統(tǒng), 算力是它的價(jià)值之錨,如果沒(méi)有算力,就會(huì)退化為一個(gè)股權(quán)系統(tǒng) 。算力在哪,資金就會(huì)跟去哪。目前的發(fā)展趨勢(shì)也是逐漸往多層網(wǎng)絡(luò)的方向發(fā)展,類似TCP/IP的多層協(xié)議棧。從作為基礎(chǔ)層(Base Layer)的角度看,更需要的是長(zhǎng)期穩(wěn)定與提供價(jià)值支撐,因此PoW系統(tǒng)更合適;而PoS可能更多的是可以作為L(zhǎng)ayer2以實(shí)現(xiàn) 可擴(kuò)展性 (Scalability) ,彌補(bǔ)PoW基礎(chǔ)層的吞吐量不足,并通過(guò)錨定在PoW基礎(chǔ)層上來(lái)獲取算力安全性與價(jià)值支撐。
最后順帶說(shuō)下最近市場(chǎng)行情,5,6月份以來(lái)的瀑布令很多人很恐慌,恐慌指數(shù)一度長(zhǎng)時(shí)間停留在個(gè)位數(shù);其實(shí)我覺(jué)得也沒(méi)必要那么恐慌,要在這個(gè)圈子長(zhǎng)期活下去,面對(duì)這種大波動(dòng)的心理預(yù)期還是要有的。想起之前紅杉資本的沈南鵬經(jīng)常提到一個(gè)詞Grit,沙礫,它是礫石在千萬(wàn)次打磨后留下來(lái)的細(xì)小顆粒;Grit代表了勇氣和持之以恒的一種堅(jiān)持,有種經(jīng)常被按地上摩擦但依然勇往直前的感覺(jué)。這個(gè)和塔勒布講的反脆弱性有異曲同工之妙,承載價(jià)值的東西就應(yīng)該具有這種品質(zhì),PoW系統(tǒng)肯定是有反脆弱性的。
回望2017年入圈后經(jīng)歷過(guò)的各種事件,其實(shí)像這樣的大波動(dòng)近乎每年都有(除了2019年一年比較順利外);像2017年國(guó)內(nèi)的94事件,2018年一整年的大熊市,2020的312事件,2021的519事件,再到2022今年的5,6月份市場(chǎng)轉(zhuǎn)熊,每次經(jīng)歷大波動(dòng)后,市場(chǎng)都會(huì)淘汰掉該淘汰的,出清掉該出清的風(fēng)險(xiǎn),對(duì)整個(gè)行業(yè)發(fā)展也是好事。眼光還是應(yīng)該放遠(yuǎn)一點(diǎn),至少看5到10年后的變化,科技發(fā)展過(guò)程中所帶來(lái)的波動(dòng)和風(fēng)險(xiǎn)是不可避免的,日光之下無(wú)新鮮事,每次科技革命過(guò)程中總會(huì)夾雜著眾多的反對(duì)、質(zhì)疑,還有眾多的投機(jī)、騙局;這個(gè)過(guò)程也總是通過(guò)各種暴雷、回歸,清除泡沫后價(jià)值重估,夯實(shí)了基礎(chǔ)后積蓄能量再次進(jìn)入躍升到新的發(fā)展階段。 價(jià)值互聯(lián)網(wǎng)的到來(lái)是一件無(wú)法回避的事情 ,當(dāng)理解和看清了這種趨勢(shì)后,規(guī)避掉各種坑和市場(chǎng)噪音,遠(yuǎn)離合約杠桿和各種山寨的誘惑,握住核心資產(chǎn),時(shí)間本身就會(huì)帶來(lái)回報(bào)。

轉(zhuǎn)載請(qǐng)帶上網(wǎng)址:http://www.lol998.com/posjifour/244886.html
- 上一篇:又有10家pos機(jī)被封殺
- 下一篇:手持智能pos機(jī)圖集