比特幣nodejs
❶ 如何通過雪球查詢股票之前的變動狀況
一. 雪球公司介紹
雪球 聰明的投資者都在這里。
web 1.0:新聞資訊,股價信息,K線圖
web 2.0:SNS 訂閱,分享,聊天
web 3.0:移動 APP,交易閉環
雪球現在員工數還不到100,其中技術人員佔一半。去年9月C輪融資4kw刀。我們現在的技術棧由下列組件組成:Java,Scala,Akka,Finagle,Nodejs,Docker ,Hadoop。我們當前是租用IDC機房自建私有雲,正在往「公私混合雲」方向發展。
在雪球上,用戶可以獲取滬深港美2w+股票的新聞信息,股價變化情況,也可以獲取債券,期貨,基金,比特幣,信託,理財,私募等等理財產品的各類信息,也可以關注雪球用戶建立的百萬組合,訂閱它們的實時調倉信息,還可以關注雪球大V。雪球當前有百萬日活躍用戶,每天有4億的API調用。App Store 財務免費榜第 18 名。歷史上曾排到財務第二,總免費榜第 19。
二. 雪球當前總體架構
作為一個典型的移動互聯網創業公司,雪球的總體架構也是非常典型的設計:
最上層是三個端:web端,android端和iOS端。流量比例大約為 2:4:4 。web3.0 的交易功能,在 web 端並不提供。
接入層以及下面的幾個層,都在我們的自建機房內部。雪球當前只部署了一個機房,還屬於單機房時代。正在進行「私有雲+公有雲混合部署」方案推進過程中。
我們當前使用 nodejs 作為 web 端模板引擎。nodejs 模塊與android 和 ios 的 app 模塊一起屬於大前端團隊負責。
再往下是位於 nginx 後面的 api 模塊。跟 linkedin 的 leo 和微博的 v4 一樣,雪球也有一個遺留的大一統系統,名字就叫 snowball 。最初,所有的邏輯都在 snowball 中實現的。後來慢慢的拆出去了很多 rpc 服務,再後來慢慢的拆出去了一些 http api 做成了獨立業務,但即便如此,snowball 仍然是雪球系統中最大的一個部署單元。
在需要性能的地方,我們使用 netty 搭建了一些獨立的介面,比如 quoto server,是用來提供開盤期間每秒一次的股價查詢服務,單機 qps 5w+,這個一會再細說;而 IM 服務,起初設計里是用來提供聊天服務,而現在,它最大的用途是提供一個可靠的 push 通道,提供 5w/s 的消息下發容量,這個也一會再細說。
雪球的服務化拆分及治理採用 twitter 開源的 finagle rpc 框架,並在上面進行了一些二次開發和定製。定製的功能主要集中在 access log 增強,和 fail fast,fail over 策略及降級開關等。 finagle 的實現比較復雜,debug 和二次開發的門檻較高,團隊內部對此也進行了一些討論。
雪球的業務比較復雜,在服務層中,大致可以分為幾類:第一類是web1.0,2.0 及基礎服務,我們稱為社區,包括用戶,帖子,新聞,股價,搜索等等,類比對象就是新浪財經門戶+微博;第二類是組合及推薦,主要提供股票投資策略的展示和建議,類比對象是美國的motif;第三類是通道,類似股市中的「支付寶」,接入多家券商,提供瞬間開戶,一鍵下單等等各種方便操作的功能。
雪球的業務實現中,包含很多非同步計算邏輯,比如搜索建索引,比如股票漲跌停發通知,比如組合收益計算等等,為此,我們設計了一個獨立的 Thread/Task 模塊,方便管理所有的後台計算任務。但隨著這些 task 越來越多,邏輯差異越來越大,一個統一的模塊並不是總是最佳的方案,所以,我們又把它拆成了兩大類:流式的,和批量式的。
雪球的推薦體系包括組合推薦「買什麼」和個性化推薦。我們最近正在重新梳理我們的大數據體系,這個感興趣的話可以單聊。
最下面是基礎設施層。雪球基礎設施層包括:redis,mysql,mq,zk,hdfs,以及容器 docker。
線上服務之外,我們的開發及後台設施也很典型:gitlab開發,jenkins打包,zabbix 監控系統向 openfalcon 遷移,redimine向confluence遷移,jira,以及內部開發的 skiing 後台管理系統。
** 三. 雪球架構優化歷程**
首先描述一下標題中的「股市動盪」定語修飾詞吧:
上證指數從年初的3000點半年時間漲到了5000多,6月12號達到最高點5200點,然後就急轉直下,最大單日跌幅 8.48%,一路跌回4000點以下。最近一周都在3900多徘徊。
3月最後一周,A股開戶 166萬戶,超過歷史最高紀錄 2007年5月第二周165萬戶。
4月份,證監會宣布A股支持單用戶開設多賬戶。
6月底,證金公司代表國家隊入場救市。
7月份,證監會宣布嚴打場外配資。
中國好聲音廣告第一晚,帶來超過平時峰值200倍的注冊量
挑戰:小 VS 大:
小:小公司的體量,團隊小,機器規模小
大:堪比大公司的業務線數量,業務復雜度,瞬間峰值沖擊
雪球的業務線 = 1個新浪財經 + 1 個微博 + 1 個 motif + 1 個大智慧/同花順。由於基數小,API調用瞬間峰值大約為平時峰值的 30+ 倍。
挑戰:快速增長,移動互聯網 + 金融,風口,A股大盤劇烈波動。
首先,在app端,在我們核心業務從 web2.0 sns 向 3.0 移動交易閉環進化的過程中,我們開發了一個自己的 hybrid 框架:本地原生框架,加離線 h5 頁面,以此來支撐我們的快速業務迭代。當前,雪球前端可以做到 2 周一個版本,且同時並行推進 3 個版本:一個在 app store 等待審核上線,一個在內測或公測,一個在開發。我們的前端架構師孟祥宇在今年的 wot 上有一個關於這方面的詳細分享,有興趣的可以稍後再深入了解。
雪球App實踐—構建靈活、可靠的Hybrid框架 http://wot.51cto.com/2015mobile/ http://down.51cto.com/data/2080769
另外,為了保障服務的可用性,我們做了一系列的「端到端服務質量監控」。感興趣的可以搜索我今年4月份在環信SM meetup上做的分享《移動時代端到端的穩定性保障》。其中在 app 端,我們採用了一種代價最小的數據傳輸方案:對用戶的網路流量,電池等額外消耗幾乎為0
每個請求里帶上前一個請求的結果
succ or fail : 1 char
失敗原因:0 - 1 char
請求介面編號: 1 char
請求耗時:2 - 3 char
其它:網路制式,etc
炒股的人大多都會盯盤:即在開盤期間,開著一個web頁面或者app,實時的看股價的上下跳動。說到「實時」,美股港股當前都是流式的數據推送,但國內的A股,基本上都是每隔一段時間給出一份系統中所有股票現價的一個快照。這個時間間隔,理論上是3秒,實際上一般都在5秒左右。 交了錢簽了合同,雪球作為合作方就可以從交易所下屬的數據公司那裡拿到數據了,然後提供給自己的用戶使用。
剛才介紹總體架構圖的時候有提到 quote server ,說到這是需要性能的地方。
業務場景是這樣的,雪球上個人主頁,開盤期間,每秒輪詢一次當前用戶關注的股票價格變動情況。在內部,所有的組合收益計算,每隔一段時間需要獲取一下當前所有股票的實時價格。起初同時在線用戶不多,這個介面就是一個部署在 snowball 中的普通介面,股價信息被實時寫入 redis ,讀取的時候就從 redis 中讀。後來,A股大漲,snowball 抗不住了。於是我們就做了一個典型的優化:獨立 server + 本地內存存儲。開盤期間每次數據更新後,數據接收組件主動去更新 quote server 內存中的數據。 後續進一步優化方案是將這個介面以及相關的處理邏輯都遷移到公有雲上去。
對於那些不盯盤的人,最實用的功能就是股價提醒了。在雪球上,你除了可以關注用戶,還可以關注股票。如果你關注的某隻股票漲了或跌了,我們都可以非常及時的通知你。雪球上熱門股票擁有超過 50w 粉絲(招商銀行,蘇寧雲商)粉絲可以設置:當這支股票漲幅或跌幅超過 x%(默認7%)時提醒我。曾經連續3天,每天超過1000股跌停,證監會開了一個會,於是接下來2天超過1000股漲停
原來做法:
股票漲(跌)x%,掃一遍粉絲列表,過濾出所有符合條件的粉絲,推送消息
新做法:
預先建立索引,開盤期間載入內存
1%:uid1,uid2
2%:uid3,uid4,uid5
3%:uid6
問題:有時候嫌太及時了:頻繁跌停,打開跌停,再跌停,再打開。。。的時候
內部線上記錄:
4台機器。
單條消息延時 99% 小於 30秒。
下一步優化目標:99% 小於 10 秒
IM 系統最初的設計目標是為雪球上的用戶提供一個聊天的功能:
送達率第一
雪球IM:Netty + 自定義網路協議
Akka : 每個在線client一個actor
推模式:client 在線情況下使用推模式
多端同步:單賬號多端可登錄,並保持各種狀態同步
移動互聯網時代,除了微信qq以外的所有IM,都轉型成了推送通道,核心指標變成了瞬間峰值性能。原有架構很多地方都不太合適了。
優化:
分配更多資源:推送賬號actor池
精簡業務邏輯:重復消息只存id,實時提醒內容不推歷史設備,不更新非活躍設備的session列表等等
本地緩存:拉黑等無法精簡的業務邏輯遷移到本地緩存
優化代碼:非同步加密存儲,去除不合理的 akka 使用
akka這個解釋一下:akka 有一個自己的 log adapter,內部使用一個 actor 來處理所有的 log event stream 。當瞬間峰值到來的時候,這個 event stream 一下子就堵了上百萬條 log ,導致 gc 顛簸非常嚴重。最後的解決辦法是,繞過 akka 的 log adapter,直接使用 logback 的 appender
線上記錄:5w/s (主動限速)的推送持續 3 分鍾,p99 性能指標無明顯變化
7月10號我們在中國好聲音上做了3期廣告。在廣告播出之前,我們針對廣告可能帶來的對系統的沖擊進行了壓力測試,主要是新用戶注冊模塊,當時預估廣告播出期間2小時新注冊100萬
壓測發現 DB 成為瓶頸:
昵稱檢測 cache miss > 40%
昵稱禁用詞 where like 模糊查詢
手機號是否注冊 cache miss > 80%
注冊新用戶:5 insert
優化:
redis store:昵稱,手機號
本地存儲:昵稱禁用詞
業務流程優化:DB insert 操作同步改非同步
下一步優化計劃:
將 sns 系統中所有的上行操作都改成類似的非同步模式
介面調用時中只更新緩存,而且主動設置5分鍾過期,然後寫一個消息到 mq 隊列,隊列處理程序拿到消息再做其它耗時操作。
為了支持失敗重試,需要將主要的資源操作步驟都做成冪等。
前置模塊HA:
合作方合規要求:業務單元部署到合作方內網,用戶的敏感數據不允許離開進程內存
業務本身要求:業務單元本身為有狀態服務,業務單元高可用
解決方案:
使用 Hazelcast In-Memory Data Grid 的 replication map 在多個 jvm 實例之間做數據同步。
java 啟動參數加上 -XX:+DisableAttachMechanism -XX:-UsePerfData,禁止 jstack,jmap 等等 jdk 工具連接
關於前置模塊,其實還有很多很奇葩的故事,鑒於時間關系,這里就不展開講了。以後有機會可以當笑話給大家講。
組合凈值計算性能優化:
一支股票可能在超過20萬個組合里(南車北車中車,暴風科技)
離線計算,存儲計算後的結果
股價3秒變一次,涉及到這支股票的所有組合理論上也需要每 3 秒重新計算一次
大家可能會問,為什麼不用戶請求時,實時計算呢?這是因為「組合凈值」中還包括分紅送配,分股,送股,拆股,合股,現金,紅利等等,業務太過復雜,開發初期經常需要調整計算邏輯,所以就設計成後台離線計算模式了。當前正在改造,將分紅送配邏輯做成離線計算,股價組成的凈值實時計算。介面請求是,將實時計算部分和離線計算部分合並成最終結果。
實際上,我們的計算邏輯是比較低效的:循環遍歷所有的組合,對每個組合,獲取所有的價值數據,然後計算。完成一遍循環後,立即開始下一輪循環。
優化:
分級:活躍用戶的活躍組合,其它組合。
批量:拉取當前所有股票的現價到 JVM 內存里,這一輪的所有組合計算都用這一份股價快照。
關於這個話題的更詳細內容,感興趣的可以參考雪球組合業務總監張岩楓在今年的 arch summit 深圳大會上的分享:構建高可用的雪球投資組合系統技術實踐 http://sz2015.archsummit.com/speakers/201825
最後,我們還做了一些通用的架構和性能優化,包括jdk升級到8,開發了一個基於 zookeeper 的 config center 和開關降級系統
四. 聊聊關於架構優化的一些總結和感想
在各種場合經常聽說的架構優化,一般都是優化某一個具體的業務模塊,將性能優化到極致。而在雪球,我們做的架構優化更多的是從問題出發,解決實際問題,解決到可以接受的程度即可。可能大家看起來會覺得很凌亂,而且每個事情單獨拎出來好像都不是什麼大事。
我們在對一個大服務做架構優化時,一般是往深入的本質進行挖掘;當我們面對一堆架構各異的小服務時,「架構優化」的含義其實是有一些不一樣的。大部分時候,我們並不需要(也沒有辦法)深入到小服務的最底層進行優化,而是去掉或者優化原來明顯不合理的地方就可以了。
在快速迭代的創業公司,我們可能不會針對某一個服務做很完善的架構設計和代碼實現,當出現各種問題時,也不會去追求極致的優化,而是以解決瓶頸問題為先。
即使我們經歷過一回將 snowball 拆分服務化的過程,但當我們重新上一個新的業務時,我們依然選擇將它做成一個大一統的服務。只是這一次,我們會提前定義好每個模塊的 service 介面,為以後可能的服務化鋪好路。
在創業公司里,重寫是不能接受的;大的重構,從時間和人力投入上看,一般也是無法承擔的。而「裱糊匠」式做法,哪裡有性能問題就加機器,加緩存,加資料庫,有可用性問題就加重試,加log,出故障就加流程,加測試,這也不是雪球團隊工作方式。我們一般都採用最小改動的方式,即,准確定義問題,定位問題根源,找到問題本質,制定最佳方案,以最小的改動代價,將問題解決到可接受的范圍內。
我們現在正在所有的地方強推3個數據指標:qps,p99,error rate。每個技術人員對自己負責的服務,一定要有最基本的數據指標意識。數字,是發現問題,定位根源,找到本質的最重要的依賴條件。沒有之一。
我們的原則:保持技術棧的一致性和簡單性,有節制的嘗試新技術,保持所有線上服務依賴的技術可控,簡單來說,能 hold 住。
能用cache的地方絕不用db,能非同步的地方,絕不同步。俗稱的:吃一塹,長一智。
特事特辦:業務在發展,需求在變化,實現方式也需要跟著變化。簡單的來說:遺留系統的優化,最佳方案就是砍需求,呵呵。
❷ 2018TPC必火,全解析
TPC 誕生背景:
TPC的誕生區別於現有模式,一般模式是先開發區塊鏈應用並在區塊鏈中產生,用來在區塊鏈中作為記賬單位而存在。然後依據應用的發展再炒高的價值。
顯然,目前所有區塊鏈都是這樣的現狀。而目前在所有可以用互聯網技術服務的行業中基本處於飽和或壟斷狀態,所以目前區塊鏈技術在真實的應用當中比較難落地,因為目前區塊鏈整體行業處於萌芽狀態中,對很多事物仍然處於探索之中。所以目前形勢,區塊鏈應該是一個重商業運營的技術服務,而非重技術服務輕商業運營。
緬甸銀行業現狀與支付系統的可行性
緬甸目前13家外資銀行,本土銀行24家,2016年央行對所有銀行全部實現電算化,這對支付行業的外部環境是一個非常好的喜訊。緬甸6000萬人口,有3000+萬智能手機,卻沒有本土的APP,在這之前外部環境與第三方支付不在,所以基於互聯網的創業基本都失敗了。正是因為如此,第三方支付才能夠成為緬甸的新經濟基石。
緬甸3000+萬智能手機用戶,僅以仰光為例,每年600+億美金的消費額度,線上消費更是難以估量,未來5億的投放量,從0.14美金來看,如果線下市場佔有率為10%就有60億美金的流通,還未包含線上,其上漲空間甚至超過20倍。Grab在緬甸投資5億美金就是緬甸移動互聯網市場最好的寫照。當第三方支付用戶達到500萬用戶的時候,其資本估值將達到幾十億美金以上。
TPC
TPC基於以太坊智能合約,TPC就是以太坊的一條側鏈,同時也是主鏈,而後續的所有基於金融、理財、基金等等的開發與探索將都依託TPC進行,其後的所有開發將都是TPC的側鏈。TPC目前可以在imToken等以太坊錢包均可以進行收發,並預留未來開發介面:
其token完整版:
[ { "constant": true, "inputs": [], "name": "name", "outputs": [ { "name": "", "type": "string", "value": "TPC" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [ { "name": "", "type": "uint256", "value": "10000000000000" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "name": "", "type": "uint8", "value": "4" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "balanceOf", "outputs": [ { "name": "", "type": "uint256", "value": "0" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "name": "", "type": "address", "value": "" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "name": "", "type": "string", "value": "TPC" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "transfer", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "frozenAccount", "outputs": [ { "name": "", "type": "bool", "value": false } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "target", "type": "address" }, { "name": "freeze", "type": "bool" } ], "name": "freezeAccount", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "name": "tokenName", "type": "string", "index": 0, "typeShort": "string", "bits": "", "displayName": "token Name", "template": "elements_input_string", "value": "TPC" }, { "name": "tokenSymbol", "type": "string", "index": 1, "typeShort": "string", "bits": "", "displayName": "token Symbol", "template": "elements_input_string", "value": "TPC" }, { "name": "decimalUnits", "type": "uint8", "index": 2, "typeShort": "uint", "bits": "8", "displayName": "decimal Units", "template": "elements_input_uint", "value": "4" }, { "name": "initialSupply", "type": "uint256", "index": 3, "typeShort": "uint", "bits": "256", "displayName": "initial Supply", "template": "elements_input_uint", "value": "10000000000000" } ], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "target", "type": "address" }, { "indexed": false, "name": "frozen", "type": "bool" } ], "name": "FrozenFunds", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" } ]
完整內容會發布在GitHub中。
TPC選擇以太坊是因為以太坊是一個成熟的開發平台,在區塊鏈應用中可以節省大量時間,並為後續開發降低難度。獨自開發私有鏈需要大量技術人員進行迭代更新,其維護成本、應用成本、使用成本、時間成本、開發成本、價值成本不成比例,因為TPC是為商業模式而誕生。最大限度去挖掘商業價值。
TPC 的未來
緬甸銀行業的落後並不能阻擋TPC的布局,TPC將優先進駐銀行,商場,通過已有錢包進行收發。第三方支付平台已經進入最後調試階段,上線後再與之打通,成為必要的支付方式。TPC通過智能合約為銀行、保險、數據分析、基金、現貨、期貨等金融行業提供數據解決方案,並共享信用數據,同時作為獎勵為數據進行獎勵支出。因為本身TPC就是智能合約,通過其介面的開放可以為未來所有的金融產業做數據支持。而TPC的未來會成為理財產品,其覆蓋人群將會超過1500萬人,未來的價值空間將會呈現一個幾何式的增長。價格也會隨之而爆發。
TPC 總量
總量為10億,其中5億作為政府基金存在逐步釋放到市場進行流通,而後5億將逐步用於支付市場的流通。
TPC 商業價值
TPC最大的價值在於打通與第三方支付與理財應用的信用數據。通過嵌入在第三方支付體系當中可以使TPC進行用於線上、線下支付,打通最重要的流通環節,因為之所以有價格就是因為其價值,而其價值背後就是流通屬性。當有流通後就會產生買賣需求,所以才會有不同的價格走向。如果不能解決的流通性,那麼就是空氣幣,TPC的商業價值就在於用商業思維解決區塊鏈--應用的閉環模式。在TPC中,三者相對獨立而又結合。但公開、透明、安全。
這就好比比特幣一樣,比特幣之所以在2010年之前默默無聞不是因為沒人知道,做極客的那一小撮人很早就知道了比特幣的存在,但是他不具備流通屬性而一直不值錢,2010年那個程序員拿1000個比特幣換了一個披薩的新聞還不時被我們作為笑話,其實這就是背後流通性的不暢導致的。2011年絲綢之路的誕生2年時間150億美金的交易額全部來自比特幣,才讓比特幣成為了眾人皆知。可以說絲綢之路是讓沉睡的比特幣覺醒的一劑猛葯。
TPC 的商業生態
第三方支付 - 電商生態 - 游戲生態 - 社交生態
第三方支付相當於一個承接TPC的平台,因為緬甸目前沒有第三方支付,所以第三方支付在實際運作中會成為類似支付寶或者paypal的應用,那支付寶或paypal的價值因為第三方支付支付平台的誕生只是商業生態中的第一步,正是因為支付平台的誕生,TPC才可以進行流通。而第三方支付平台的出現才可以解決目前緬甸沒有電商、社交、游戲等等APP的局面,之前非常多的人都在緬甸建立電商、分類信息、游戲等平台,但是都倒閉了。其最重要的原因就是沒有第三方支付平台,第三方支付平台可成為緬甸線上、線下的一個新支付通道。當第三方支付平台的建立之後,所有其他公司的應用都會將其作為一種支付渠道接入,而TPC作為一種貨幣基金就會充分成為流通需求而出現。
TPC 為什麼依託以太坊而不是獨自開發
1.以太坊開發平台成熟,穩定
2.開發難度低,使用方便,面向人群更廣
TPC 運營團隊
丁林,CEO,緬籍華僑,主導投資Grandland以及一系列投資方案,累計投資超過7000萬美金。貌明,COO,緬籍華僑,原telenor緬甸高級經理,運營、執行能力強勢。負責整體運營與市場銷售。還有之前負責市場運營、市場調研員、文化分析員等大量優秀夥伴。
開發團隊由新加坡鄭憶安擔任主研,精通JAVA與nodejs,10年開發經驗,並且由來自中國、捷克的團隊一起進行技術探索。TPC研究室為其提供基礎支持。
TPC 分配方案
8%-----用於私募,早期投資者和對TPC前景看好的會員。
12%——ICO公募眾籌投資者,戰略投資夥伴。
10%——研究室基金,對技術的探索和未來應用落地
5%——-市場推廣,宣傳分發,戰略合作
15%——-商業落地部署,商業合作,市場開拓
50%——存放政府,根據市場逐步釋放
市場流通少,價值又可以落地實現。價格一定會幾何級增長
如果用一句話講 TPC
存在於第三方支付之中,未來覆蓋與使用人群會在千萬級以上,而現在能接近千萬級的只有比特幣,以太坊。
❸ 目前國內有哪些區塊鏈技術應用開發平台
所謂區塊鏈技術,簡稱BT(Blockchain technology),也被稱之為分布式賬本技術,是一種互聯網資料庫技術,其特點是去中心化、公開透明,讓每個人均可參與資料庫記錄。
❹ 樹莓派4B+ Centos7 部署k3s集群工具
kubernetes用於大型集群管理,而k3s屬於kubernetes的一個輕量級版本,常用於嵌入式設備使用。現把它安裝到樹莓派上使用。
這里用到樹莓派的系統是:CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2009-sda.raw,型號是4B+,8g內存。
樹莓派初次啟動需要擴容,並且做一些基本調整:
cgroup是linux用來對進程分配cpu、內存資源的工具,需要在啟動系統時開啟他,k3s會用到。
在/boot/cmdline.txt後加入這個,然後reboot
k3s是一個輕量級的k8s,適用於樹莓派這種嵌入式設備。
這個腳本跑完的時候,會把k3s添加到systemd裡面,可以通過systemctl status k3s來查看運作狀態。啟動成功就可以使用啦
官方參考: https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/
等它重啟個好幾次之後,基本就成功了。
如果一直失敗,可以輸入命令刷一下iptable緩沖
iptables --flush
iptables -tnat --flush
等第二個結點加入後,在任意結點執行命令,都能查看到已有的2個Server(Master)結點了
當Server結點數大於等於3個且為奇數時,集群才可以實現高可用。
大於等於3是因為k3s使用了Raft演算法來實現一致性,而Raft演算法的容崩率為1/3,也就是只要集群中有2/3台機器正常運作,集群就能正常運作,所以3台機器是最低要求;要奇數個結點是因為Raft演算法過程中有一個很重要的隨機投票選Leader的流程,結點們通過定期投票選舉出一個Leader角色,然後其他結點在它的任期內就向他同步數據,這個時候如果結點數是偶數,那麼容易出現平票問題,選不出leader,並且,崩潰後集群進行數據恢復過程中,實現一致的方法是多數服從少數,如果是偶數Master結點,且剛好被分割成2個結點規模一樣的集團,就沒辦法恢復數據了[裂開],所以需要奇數個結點以避免權力平分問題。
以上為個人理解。
有興趣的同學可以一起探討這類共識演算法,與此類似的還有聯盟鏈的PBFT類演算法,比特幣PoW演算法等等。
因為集群並非開放式集群,加入集群需要獲取一個token作為校驗。這個token可以從Master伺服器上獲取。(手動加入的話,僅需要使用相同的K3S_TOKEN參數啟動即可。)
這樣,結點就正常連接上啦:
關閉k3s進程後,後台還留存一些服務佔用著埠,需要用官方腳本關閉他們
可以flush一下iptables,等他自己重啟就行了。
有可能發生了一些沖突,可以試下重裝k3s-agent
目前系統已經伴隨k3s安裝的一些軟體:
crictl :類似與docker的命令行工具,比如:
k3s :封裝了kubeneters基本工具在裡面的集成,如使用kubectl:
這里示範部署一個最簡單的web應用
--net host 代表與本機享受同一個網路命名空間
這里可以在docker容器內開啟ssh服務: https://blog.csdn.net/Leo_csdn_/article/details/96150534
做好docker鏡像後,就可以部署到集群上了。
等一會兒就能在pods列表裡面看到了:
但這時候,這個pod並沒有對外開放,只能在集群內部相互訪問,通過get services命令查看集群的服務,發現並沒有我們的hello-node服務。
expose命令其實是創建了一個service,用於給這個pod提供訪問入口。
(如果使用--type=LoadBalancer,則代表一個deployment上管理的所有POD進行均衡負載,但這里還沒用上deployment,第四章節會使用到)
等一會兒,pod上就有一個結點IP的對外埠,供外部訪問了。
運行結束後,剛啟動過的pod和service就不見了,服務也停止了。
docker容器,其實就是一個運行的輕量級系統,裡面可以跑我們的業務應用。
而POD則是代表容器的集合,一個POD可以運行多個容器,一台機器上可以運行多個POD。
POD未必是一個對外開放的服務,他可能只是內部計算的程序,默認只能集群內部通信,所以還有Service的概念,用於讓POD對外開放埠,供外部訪問。這里的service本質上是個集群內部的負載均衡器,用來給同一個Deployment分流;對應的還有Ingress,外部負載均衡器,用於給多個Deployment分流。
而Deployment顧名思義,就是一次部署的抽象實例,比如說,現在需要部署一個3台機器均衡負載的nodejs業務應用,那麼這個部署任務則代表一個deployment實例。
很快,我們可以看到POD和deployment的部署情況,都已經正常運作。
進入容器後可以使用基本linux命令,也可見8080埠已經被我們的node應用佔用了。
但是此時service還沒有他們,也就是正處於無法提供外部服務的狀態。
這里對一個deployment裡面的3個pod啟動了個默認均衡負載服務,暴露出來的一個埠是30057,訪問可通。
也能夠通過logs命令查看控制台輸出的日誌。
因為deployment實例中包含了pod的部署配置,所以刪除deployment時,k3s就會直接把pod也刪除掉。
但service並不在deployment部署的范圍內,所以需要同步刪除它,在刪除命令中通過","與deployment分割開來即可。
至此已經把剛起來的服務全部關閉掉了。
這里我們看到3個Server(Master)結點由於需要維護集群高可用,對CPU持續20%左右的消耗,內存也需要一個G左右。而Agent(Wroker)結點只需要執行部署任務,所以對內存與CPU的需求都相對低一些,僅維持在10%左右的CPU和半個G左右的內存消耗。
參考: https://zhuanlan.hu.com/p/120171512
參考: http://kubernetes.kansea.com/docs/hellonode/
❺ 區塊鏈技術入門,涉及的編程語言有哪些
Go 語言為區塊鏈主流語言
根據 BOSS 研究院數據調查顯示,目前在招的區塊鏈崗位
主流的語言是 Go 和 C++ 語言,早期的區塊鏈系統和應用
程序主要是以 C++ 實現,現在多數公司都會用 Go 語言來
打造公鏈系統。
C++適合本地程序的開發.
Go語言適合網路程序和本地程序的開發.
相對於C++Go的優點:
垃圾回收
語意明確
格式統一
缺點:
效率目前沒有C++高,但對於桌面程序而言,效率問題不大,因為硬體已經很快了.
C++是目前的主流語言,相信會和C一樣成為經典.
成為經典的意思就是:學它的人能拿一份不錯的工資,但也僅僅是不錯而己.
將來的網路的世界,Go發熱的機會很大,認為其前途看好.
Go的開發者包括Unix的創始人和C語言的創始人等,都是一代黑客之首,相信會做得很好.
現在go全棧+區塊鏈市場出於前所未有的大風口,形勢喜人。
❻ 什麼是區塊鏈,什麼是大數據
1、區塊鏈:是分布式數據存儲、點對點傳輸、共識機制、加密演算法等計算機技術的新型應用模式。所謂共識機制是區塊鏈系統中實現不同節點之間建立信任、獲取權益的數學演算法 。
區塊鏈(Blockchain)是比特幣的一個重要概念,貨幣聯合清華大學五道口金融學院互聯網金融實驗室、新浪科技發布的《2014—2016全球比特幣發展研究報告》提到區塊鏈是比特幣的底層技術和基礎架構[2] 。本質上是一個去中心化的資料庫,同時作為比特幣的底層技術。區塊鏈是一串使用密碼學方法相關聯產生的數據塊,每一個數據塊中包含了一次比特幣網路交易的信息,用於驗證其信息的有效性(防偽)和生成下一個區塊。
2、大數據:指無法在一定時間范圍內用常規軟體工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。
❼ Dart語言和go誰更先進
單從運行速度兩個語言都很優秀,但運行速度不是我們唯一追求的指標,就像匯編語言寫的程序運行速度很快,但我們絕大多場合都不會採用它。
背後更重要的還有這門語言對應的生態。
比如企業要用人的時候能不能快速招到會使用它的人? 對求職者來說,我學習這門語言能不能帶來更多的工作機會?用這個語言開發應用的時候遇到問題的時候能不能快速找到資料並得以解決?
go語言歷史長、生態好、運行速度快,在服務端上面有所作為,比如為比特幣、萊特幣開發的閃電網路就是用go寫的。 語法上和類C語言有很大不同。
Dart是新出的語言,配合flutter是很好的客戶端開發語言。 語法沒那麼奇怪, 因為新所以生態自然是跟不上的。
Dart能不能用在服務端? 我個人覺得是可以, 畢竟可以Dart是可以轉成javascript的,運行在Nodejs下, 藉助於NodeJs生態,dart也可以做很多事情。
不知道你們有沒有注意到,現在有很多新語言都支持翻譯成Javascript。比如新的dart、kotlin, 還有ts是直接針對javascript語法加強而獲得成功。
話說得再多, 不如自己親自去體驗一下。 jsrun上面支持30多種語言的在線運行環境, 先體驗再做決定你到底要學哪一門語言。
http://dart.jsrun.net
http://go.jsrun.net
❽ 區塊鏈技術入門,涉及哪些編程語言
Go語言
Go語言(Golang)是谷歌2009年推出的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性。谷歌首席軟體工程師羅布派克(Rob Pike)說:「我們之所以開發Go,是因為過去10多年間軟體開發的難度令人沮喪。」
除比特幣是由C++開發以外,目前最主流坊的客戶端均有go語言開發,足以可見Go語言在整個區塊鏈行業的地位。
C++
C++ 進一步擴充和完善了 C 語言,是一種面向對象的程序設計語言。C++ 可運行於多種平台上,如 Windows、MAC 操作系統以及 UNIX 的各種版本。C++是一種使用十分廣泛的計算機程序設計語言。它是一種通用程序設計語言,支持多重編程模式,例如過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計和設計模式等。
大多數的區塊鏈企業都選擇用C++編寫區塊鏈的底層,最著名的有比特幣、ripple等,主要體現的是強計算性。
Java
Java不同於一般的編譯語言或解釋型語言。它首先將源代碼編譯成位元組碼,然後依賴各種不同平台上的虛擬機來解釋執行位元組碼,從而實現了「一次編寫,到處運行」的跨平台特性。而區塊鏈項目的開發,對Java有著明顯的依賴性。
其他的還有Python、系統架構、以太坊、Linux、hyperledger、JavaScript等都會有涉及。
❾ 比特幣是怎樣運作的
從運作上看,比特幣實際上是一個互聯網上的去中心化賬本。
1、中心化賬本(銀行)
銀行是一個中心化賬本,賬本存儲在銀行的中心資料庫,上面寫著:
張三的A賬號余額3000元,李四的B賬號余額2000元……
當張三想要通過A賬號轉賬1000元給李四的B賬號時:
a張三到銀行,向銀行提交轉賬要求
b銀行通過銀行卡密碼等方式確認張三身份,並檢查張三的A賬號是否有足夠余額。
c檢查通過後,銀行增加一條轉賬記錄:A賬號向B賬號轉賬1000元,
並修改余額:A賬號余額=3000-1000=2000元,B賬號余額=2000+1000=3000元
2、去中心化賬本
假設有這樣的一個小村莊,大家不是靠銀行,而是自己用賬本來記錄誰有多少錢,每個人的賬本上都寫著:
張三的A賬號余額3000元,李四的B賬號余額2000元……
當張三想要通過A賬號轉賬1000元給李四的B賬號時,
a張三大吼一聲:大家注意啦,我用A賬號給李四的B賬號轉1000塊錢。
b張三附近的村民聽了確實是張三的聲音,並且檢查張三的A賬號是否有足夠余額。
c檢查通過後,村民往自己的賬本上寫:A賬號向B賬號轉賬1000元,
並修改余額:A賬號余額=3000-1000=2000元,B賬號余額=2000+1000=3000元。
d張三附近的村民把轉賬告訴較遠村民,一傳十十傳百,直到所有人都知道這筆轉賬,以此保證所有人賬本的一致性。
3、去中心化賬本(比特幣)
比特幣用戶在電腦上運行比特幣客戶端軟體,這樣的電腦稱為一個節點(node)。
大量節點電腦互相連接,形成一張像蜘蛛網一樣的P2P(點對點)網路。
當張三想要通過A賬號轉賬1比特幣給李四的B賬號時,當張三想要通過A賬號轉賬1比特幣給李四的B賬號時,
a張三向周圍節點廣播轉賬交易要求:A賬號轉賬1比特幣給B賬號,並用A賬號的私鑰簽名。
(A賬號的私鑰可簡單理解為A賬號的密碼,只要知道A賬號的私鑰就能使用A賬號上的比特幣)
b張三周圍的節點通過A賬號的公鑰檢查交易簽名的真偽,並且檢查張三的A賬號是否有足夠余額。
c檢查通過後,節點往自己的賬本上寫:A賬號向B賬號轉賬1比特幣元,
並修改余額:A賬號余額=3比特幣-1比特幣=2比特幣,B賬號余額=2比特幣+1比特幣=3比特幣。
d節點把這個交易廣播給周圍的節點,一傳十十傳百,直到所有節點都收到這筆交易。
比特幣的去中心化公開賬本稱為區塊鏈。這是比特幣運行的一個最簡化描述,當然比特幣的實際運行遠比這復雜。