為分布式應(yīng)用而生的微服務(wù),與區(qū)塊鏈技術(shù)是天生的一對(duì)
這期說說區(qū)塊鏈技術(shù)與微服務(wù)架構(gòu)的關(guān)系。大家知道,微服務(wù)架構(gòu)是一個(gè)分布式的應(yīng)用技術(shù)架構(gòu),目的是有效的對(duì)應(yīng)用進(jìn)行拆分,實(shí)現(xiàn)敏捷開發(fā)、快速演化、便捷容錯(cuò)與彈性伸縮。前面說到,區(qū)塊鏈技術(shù)本質(zhì)上就是分布式數(shù)據(jù)庫(kù),微服務(wù)架構(gòu)與區(qū)塊鏈技術(shù)的結(jié)合,并不能簡(jiǎn)單的看成是微服務(wù)與數(shù)據(jù)庫(kù)的結(jié)合,而應(yīng)該把區(qū)塊鏈平臺(tái)做為一個(gè)第三方應(yīng)用進(jìn)行交互,這也是微服務(wù)架構(gòu)很好發(fā)揮作用的地方。
雖然目前的區(qū)塊鏈平臺(tái)一般都有SDK和REST服務(wù)兩種方式,按照上述的原則,一般不要使用 SDK,而是遠(yuǎn)程調(diào)用方式,采用微服務(wù)的設(shè)計(jì)原則,使用區(qū)塊鏈網(wǎng)關(guān),把微服務(wù)與區(qū)塊鏈平臺(tái)集成的功能集中到網(wǎng)關(guān)中,見下圖:
微服務(wù)通過區(qū)塊鏈網(wǎng)關(guān)與區(qū)塊鏈平臺(tái)交互,區(qū)塊鏈網(wǎng)關(guān)主要功能包括通訊網(wǎng)關(guān)、事件監(jiān)聽,同時(shí)配合微服務(wù)應(yīng)用框架,完成數(shù)據(jù)一致性、對(duì)賬功能。與區(qū)塊鏈網(wǎng)關(guān)集成的能力,是微服務(wù)架構(gòu)天生具備的。
1、通訊網(wǎng)關(guān)
通訊網(wǎng)關(guān),負(fù)責(zé)處理微服務(wù)發(fā)起的對(duì)區(qū)塊鏈平臺(tái)的調(diào)用。
由于區(qū)塊鏈平臺(tái)的服務(wù)能力(每秒交易數(shù) TPS)有限,為保證區(qū)塊鏈平臺(tái)的可用性,區(qū)塊鏈網(wǎng)關(guān)采用了異步處理模式,實(shí)現(xiàn)限流、隔離、服務(wù)升降級(jí)等能力。
由于區(qū)塊鏈平臺(tái)提供的接口各有不同,區(qū)塊鏈網(wǎng)關(guān)在接受請(qǐng)求后記錄交易流水,把區(qū)塊鏈平臺(tái)提供的服務(wù)模擬為冪等服務(wù),調(diào)用者可以多次調(diào)用區(qū)塊鏈網(wǎng)關(guān),而區(qū)塊鏈網(wǎng)關(guān)僅僅調(diào)用區(qū)塊鏈平臺(tái)一次。為方便運(yùn)維,我們可以為區(qū)塊鏈平臺(tái)提供的服務(wù)定義SLA,根據(jù)這些定義靈活的進(jìn)行調(diào)用的控制。
2、事件監(jiān)聽
如果記賬簿發(fā)生了改變,如何通知微服務(wù)呢,這就是區(qū)塊鏈網(wǎng)關(guān)中事件監(jiān)聽發(fā)揮的作用。目前很多區(qū)塊鏈平臺(tái)并沒有提供事件接口,即使未來(lái)有也很難統(tǒng)一,前面也說過,智能合約運(yùn)行在沙箱中,為保證數(shù)據(jù)一致性不可能支持對(duì)外部服務(wù)的調(diào)用,也不能做為事件監(jiān)聽的回調(diào),這樣就需要在區(qū)塊鏈網(wǎng)關(guān)中進(jìn)行處理。
微服務(wù)可以注冊(cè)對(duì)某一類交易進(jìn)行監(jiān)聽,區(qū)塊鏈網(wǎng)關(guān)定時(shí)通過區(qū)塊鏈平臺(tái)的查詢接口檢索,發(fā)現(xiàn)數(shù)據(jù)變更時(shí)通知微服務(wù)。這是一個(gè)效率不高的方法,但區(qū)塊鏈平臺(tái)本身性能也不高,時(shí)延主要由共識(shí)機(jī)制造成,輪訓(xùn)的做法并不會(huì)有太大影響,這也是期待區(qū)塊鏈平臺(tái)本身提升的地方。
3、數(shù)據(jù)一致性
不能把所有數(shù)據(jù)都存儲(chǔ)在區(qū)塊鏈平臺(tái)中,而是將交易數(shù)據(jù)存儲(chǔ)在區(qū)塊鏈平臺(tái),這樣就有了本地?cái)?shù)據(jù)庫(kù)的數(shù)據(jù)與區(qū)塊鏈交易數(shù)據(jù)的一致性問題。一般來(lái)說,我們不能依賴區(qū)塊鏈平臺(tái)支持事務(wù)的回滾,因?yàn)檫@個(gè)分布式的記賬簿一旦記賬就是不可更改的,我們甚至不能指望區(qū)塊鏈平臺(tái)實(shí)時(shí)給應(yīng)用反饋記賬是否成功,因?yàn)橛锌赡芊祷爻瑫r(shí)錯(cuò)誤,不清楚是否記賬成功。
于是,區(qū)塊鏈網(wǎng)關(guān)需要和微服務(wù)配合保證數(shù)據(jù)的一致性,一般情況下微服務(wù)中的業(yè)務(wù)處理采用異步模式,發(fā)出記賬申請(qǐng)后處于等待狀態(tài),區(qū)塊鏈網(wǎng)關(guān)將記賬申請(qǐng)轉(zhuǎn)發(fā)給區(qū)塊鏈平臺(tái)。如果區(qū)塊鏈平臺(tái)返回接受Accept或者拒絕Reject,將結(jié)果通知微服務(wù);如果區(qū)塊鏈平臺(tái)返回超時(shí)或者不可確定錯(cuò)誤,即開始定時(shí)輪詢,得到結(jié)果后通知微服務(wù)。
同時(shí),微服務(wù)本身需要具備事務(wù)補(bǔ)償?shù)哪J?,如果記賬失敗進(jìn)行反交易處理。這種數(shù)據(jù)一致性處理的方式,是微服務(wù)多種處理方式中的一種,我們一般使用服務(wù)編排的方式降低這種模式的開發(fā)復(fù)雜度。
4、對(duì)賬
既然數(shù)據(jù)有本地存放,也有區(qū)塊鏈平臺(tái)存放,就有不一致的可能,就必須對(duì)賬。傳統(tǒng)對(duì)賬有以我為主、以他為主兩種模式。這里就只能以他為主,以區(qū)塊鏈平臺(tái)為主了。由于區(qū)塊鏈技術(shù)針對(duì)交易的特點(diǎn)對(duì)存儲(chǔ)結(jié)構(gòu)進(jìn)行了要求,利用已有的時(shí)間戳、交易先后次序,可以是對(duì)賬變得更加容易。
總結(jié)
區(qū)塊鏈?zhǔn)且环N新興的技術(shù),他的本質(zhì)是一種加入業(yè)務(wù)特性的分布式數(shù)據(jù)庫(kù),通過對(duì)區(qū)塊鏈技術(shù)的研究,我們找到了業(yè)務(wù)與區(qū)塊鏈技術(shù)結(jié)合的方式,提出了微服務(wù)應(yīng)用架構(gòu)集成區(qū)塊鏈的技術(shù)模式,以上是對(duì)我們研究成果一個(gè)簡(jiǎn)要介紹,后續(xù)我們還會(huì)對(duì)使用區(qū)塊鏈技術(shù)的細(xì)節(jié)進(jìn)行分析,與大家共同探討。