『壹』 7. PhxPaxos源碼分析之整體架構
目錄
1. PhxPaxos源碼分析之關於PhxPaxos
2. PhxPaxos分析之網路基礎部件
3. PhxPaxos源碼分析之Proposer、Acceptor
4. PhxPaxos源碼分析之Learner
5. PhxPaxos源碼分析之狀態機
6. PhxPaxos源碼分析之歸檔機制
7. PhxPaxos源碼分析之整體架構
前面幾章我們依次介紹了網路基礎部件、paxos三個核心角色(ProposerAcceptorLearner)、狀態機、Checkpoint機制。在PhxPaxos中,Instance對象將上述角色組合到差讓一起。多節點上Instance互相通信共同構成了一個paxos集群,有序的確定多個值。架構關系圖如下:
Instance的實現類大約有900行,主要做了一些和網路數據處理相關的邏輯,這部分並不復雜。這里我想談的是Instance初始化邏輯。
Instance的初始化在進程啟動時,進程有可能時首次啟動,也可能是異常退出後的重啟。重啟要將Instance恢復到啟動前的狀態,需要把磁碟中的數據恢復到內存中。對於PhxPaxos來說,磁碟中的數據主要集中在Acceptor、CheckpointMgr中。這里先讀取Acceptor中的數據叢慶姿,隨後讀取CheckpointMgr中的數據,並將Acceptor中未體現在CheckpointMgr中的數據進行重演。最終,將paxos的instance恢復到啟動前的狀態:
隨後將當前的instance id標記為Max Chosen Instance ID。
嚴格講llNowInstanceID不一定是Max Chosen Instance ID。因為Acceptor落盤的最後一條記錄可能是尚未選中(Chosen)的「半成品」,即提案尚未完成。所以,這里將llNowInstanceID做為Max Chosen Instance ID是不準確的。只不過當前Max Chosen Instance ID僅在確定需要保留的paxos log數量時使用,而且最小的paxos log保留數量為300,因此並沒有出什麼問題。
Instance之上是Group,每個Group包含一個Instance,Group負責Instance初始化:
Group的價值在於概念抽象,不同節點的Instance的運行狀態可能不同,即Instance ID不同,但這些Instnace仍舊屬於一個Group。另外,PhxPaxos允許同時存在多個Group,每個Group下運行多個Instance(和節點個數相同)。如果不抽象Group概念,本Group內的Instance和Group間的Instance容易產生混淆。
既然允許運行多個Group,我們需要一個Group Manager,在PhxPaxos中這個角色是Node抽象類。Node是整個PhxPaxos庫對外提供的服務類,應用通過Node :: RunNode啟動本節點的PhxPaxos服務。
至此,PhxPaxos的整體架構已經滲絕浮現:
PhxPaxos中的節點除了做為Paxos協議的參與者,還運行另外一類成為follower的節點。Follower指定一個運行Paxos協議的節點用於數據同步,它節點不參與Paxos協議,也不參與Paxos選主。Follower更像傳統意義上的同步備,當Paxos協議節點確定一個值後,將數據同步到Follower節點。但有一點不同的是:Follower節點運行Learner,當某個值缺失時,可以通過Learner主動發起AskForLearn習得。
到這里,PhxPaxos源碼分析就結束了。
整體上看,微信開源的PhxPaxos無論從架構設計、編碼質量、細節優化上絕對可以配得上「生產級」這個稱號(編碼質量尤其值得稱贊)。
更多PhxPaxos相關文章請參見官方 WIKI 。
『貳』 [探討]提高代碼質量的方法有哪些
1. 代碼風格和規范:
多看看網上的一些代碼規范,仔細思考一下制定這些規范的出發點是什麼。例如Oracle(前
SUN)公司的代碼規范,Google的代碼規范 。
2. 學習最佳實踐
在編碼中遇到的各種大大小小的問題,首先不是自己去「閉門造車」的冥思苦想,多用
Google,搜搜是否已經有現成的解決方案。
3. 閱讀優秀的開源代碼
網上有很多優秀的開源項目,針對你自己項目中遇到的問題,找找類似的開源項目,學習、
研究,最重要的是變成自己的東西。
4. 學好英語
英語是目前所有編程語言的基礎。你的文件名、類名、方法名、變數名都是需要一個好的英
語基礎才能夠起得合適。任何的業務邏輯,都需要你使用以英語為基礎的計算機語言表達出來。
英語不好,你的代碼永遠看起來不專業。
書籍涵蓋的主題從個人責任、職業發展,知道用於使代碼保持靈活、並且易於改編和復用的
各種架構技術。
總結起來方法有三:平時多練手,多閱讀優秀的源碼,閱讀優秀的編程技巧類型的書。
『叄』 C語言代碼編譯成的是機器碼,那麼怎麼實現可移植性呢
C語言代碼編譯成的是機器碼,通常不能在不同指令系統的機器上運行。
我遇到過同樣的機器,同樣的機器碼,同樣的操作系統,也就是原來在本機編好的若干程序,突然運行不了了(出錯),必須重新編譯後才能運行。因為微軟動態鏈接庫里的子程序號碼「更新」了。
如果編譯成半成品機器碼,或者類似obj,到運行的機器上再由附加的解釋器解釋(或編譯器鏈接),則可以運行。這就是所謂的「跨平台」「移植」「嵌入」。
『肆』 手機直播源碼開發怎麼做
很高興回答您的問題,我有兩種提案:源碼二開或者定製開發
首先確定一點,製作手機直播源碼,需要程序員,但是,製作手機直播源碼的過程是完全由程序員進行源碼開發,還是可以略微縮減一下工作量和工作時間,這就要回到我的兩點提案了。
2、 定製開發
這種源碼開發方式就是讓程序員從頭到腳完整的打一份手機直播源碼出來,優點是細節方面完全契合,不會有任何的限制,缺點是成本高、時間花費長、程序員工作量大等。
以上是我的提案,希望能夠獲得採納。